算法之美:探究左右元素和的差值

这篇具有很好参考价值的文章主要介绍了算法之美:探究左右元素和的差值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

算法之美:探究左右元素和的差值

本篇博客会讲解力扣“2574. 左右元素和的差值”的解题思路,这是题目链接。

先来审题:
算法之美:探究左右元素和的差值
以下是输出示例:
算法之美:探究左右元素和的差值
以下是提示:
算法之美:探究左右元素和的差值
本题的关键在于,“左和”和“右和”是如何变化的。下面我通过代码来演示。

一上来,我们应该求下表为0的元素的“左和”和“右和”。

int* leftRigthDifference(int* nums, int numsSize, int* returnSize){
    // 下标0元素的左和
    int left = 0;
    // 下标0元素的右和
    int right = 0;
    for (int i = 1; i < numsSize; ++i)
    {
        right += nums[i];
    }
}

接下来,开辟结果数组。

int* leftRigthDifference(int* nums, int numsSize, int* returnSize){
    // 下标0元素的左和
    int left = 0;
    // 下标0元素的右和
    int right = 0;
    for (int i = 1; i < numsSize; ++i)
    {
        right += nums[i];
    }

    int* ret = (int*)malloc(sizeof(int) * numsSize);
    *returnSize = numsSize;
}

遍历结果数组,把结果放进去。

int* leftRigthDifference(int* nums, int numsSize, int* returnSize){
    // 下标0元素的左和
    int left = 0;
    // 下标0元素的右和
    int right = 0;
    for (int i = 1; i < numsSize; ++i)
    {
        right += nums[i];
    }

    int* ret = (int*)malloc(sizeof(int) * numsSize);
    *returnSize = numsSize;

    for (int i = 0; i < numsSize; ++i)
    {
        ret[i] = abs(left - right);
    }

    return ret;
}

下面是关键:“左和”和“右和”是如何变化的?

  1. 对于“左和”,下标为1的元素的“左和”比起下标为0的元素的“左和”,多加了下标为0的元素,所以“左和”的变化规律是:left += nums[i];
  2. 对于“右和”,下标为1的元素的“右和”比起下标为0的元素的“右和”,需要减去下标为1的元素,所以“右和”的变化规律是:right -= nums[i + 1];

写进代码:

int* leftRigthDifference(int* nums, int numsSize, int* returnSize){
    // 下标0元素的左和
    int left = 0;
    // 下标0元素的右和
    int right = 0;
    for (int i = 1; i < numsSize; ++i)
    {
        right += nums[i];
    }

    int* ret = (int*)malloc(sizeof(int) * numsSize);
    *returnSize = numsSize;

    for (int i = 0; i < numsSize; ++i)
    {
        ret[i] = abs(left - right);
        left += nums[i];
        right -= nums[i + 1];
    }

    return ret;
}

但是这样过不了,错误信息如下:

=================================================================
==20==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000020 at pc 0x55f869e36270 bp 0x7fff04e380c0 sp 0x7fff04e380b0
READ of size 4 at 0x602000000020 thread T0
    #2 0x7f4221987082 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
0x602000000020 is located 0 bytes to the right of 16-byte region [0x602000000010,0x602000000020)
allocated by thread T0 here:
    #0 0x7f42225cf808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144
    #3 0x7f4221987082 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24082)
Shadow bytes around the buggy address:
  0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c047fff8000: fa fa 00 00[fa]fa 00 00 fa fa fa fa fa fa fa fa
  0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==20==ABORTING

这是为什么呢?其实,当计算到下标为size-1的元素的“右和”时,执行right -= nums[i+1];,i+1已经越界了。所以最后一个右和要单独算。

int* leftRigthDifference(int* nums, int numsSize, int* returnSize){
    // 下标0元素的左和
    int left = 0;
    // 下标0元素的右和
    int right = 0;
    for (int i = 1; i < numsSize; ++i)
    {
        right += nums[i];
    }

    int* ret = (int*)malloc(sizeof(int) * numsSize);
    *returnSize = numsSize;

    for (int i = 0; i < numsSize - 1; ++i)
    {
        ret[i] = abs(left - right);
        left += nums[i];
        right -= nums[i + 1];
    }

    // 防止越界,最后一个数据单独计算
    ret[numsSize - 1] = abs(left);

    return ret;
}

算法之美:探究左右元素和的差值
这样就过了。

总结

  1. 明白迭代时变量的变化规律。
  2. 如果可能越界,边界元素可以单独计算。

感谢大家的阅读!文章来源地址https://www.toymoban.com/news/detail-442510.html

到了这里,关于算法之美:探究左右元素和的差值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法:数组中的最大差值---“打擂台法“

    文章来源: https://blog.csdn.net/weixin_45630258/article/details/132737088 欢迎各位大佬指点、三连 1、题目: 给定一个整数数组 nums,找出给定数组中两个数字之间的最大差值。要求,第二个数字必须大于第一个数字。 2、 分析特点: 求最大差值 == 最大值 - 最小值 只需要遍历价格数组一

    2024年02月09日
    浏览(30)
  • 算法习题之子数组达到规定累加和的最大长度系列问题

    题目一主要技巧:利用单调性优化 题目二主要技巧:利用预处理结构优化 + 讨论开头结尾 题目三主要技巧:假设答案法+淘汰可能性

    2024年02月12日
    浏览(25)
  • OpenCV书签 #差值哈希算法的原理与相似图片搜索实验

    差值哈希算法(Difference Hash Algorithm,简称dHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片的搜索工作。   差值哈希算法通过计算相邻像素的差异来生成哈希,即通过缩小图像的每个像素与平均灰度值的比较,生成一组哈希值。最后,利用两组图像的哈希值的汉

    2024年01月23日
    浏览(33)
  • 数据结构与算法之美 | 栈

    栈结构:后进者先出,先进者后出 栈是一种“操作受限”的线性表 当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构 使用数组实现:顺序栈 使用链表实现:链式栈 函数调用栈 操作系统给每个线程

    2024年02月08日
    浏览(38)
  • 数据结构与算法之美 | 排序(3)

    桶排序(Bucket sort) 基本思想 : 将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。 桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序常常用在外部排序[^1]中。 我们有 10 GB 的订单数据,我们希望按订单金额(

    2024年02月08日
    浏览(29)
  • 探索十大经典排序算法之美(基于Python)

    在计算机科学的世界中,排序算法无疑是最为经典和基础的主题之一。排序不仅是解决各种计算问题的基础,而且在日常编程中也是必不可少的一环。Python这一富有表达力的编程语言,提供了许多强大的工具和库,使得实现和理解排序算法变得更加直观和有趣。 本篇博客将带

    2024年02月21日
    浏览(26)
  • HTML中元素和标签有什么区别?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月14日
    浏览(19)
  • 数据结构之美:如何优化搜索和排序算法

    🎉欢迎来到数据结构学习专栏~数据结构之美:如何优化搜索和排序算法 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:数据结构学习 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水

    2024年02月08日
    浏览(35)
  • 【算法】状态之美,TCP/IP状态转换探索

    最近城市里甲流肆虐,口罩已经成为了出门必备的物品。小悦也不得不开始采取防护措施,上下班过程中,将口罩戴起来以保护自己不受病毒的侵害。 每天下班后,小悦总是喜欢投入到自己的兴趣爱好中,她热衷于翻阅与IT相关的资料,希望能够更深入地了解计算机科学。而

    2024年02月05日
    浏览(21)
  • 【华为od】存在一个m*n的二维数组,其成员取值范围为0,1。其中值为1的元素具备扩散性,每经过1S,将上下左右值为0的元素同化为1。

    存在一个m*n的二维数组,其成员取值范围为0,1。其中值为1的元素具备扩散性,每经过1S,将上下左右值为0的元素同化为1。将数组所有成员初始化为0,将矩阵的[i, j]和[m,n]位置上元素修改成1后,在经过多长时间所有元素变为1。 输入描述 输入的前两个数字是矩阵大小。后面

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包