You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode有序平方数组问题中C++运行时溢出错误排查与修复咨询

分析并解决你的有序平方数组问题中的运行时错误

首先,咱们来拆解你遇到的两个核心问题:

1. 为什么start<=end会导致溢出错误?

你的else if(abs(nums[start])==abs(nums[end]))分支存在逻辑漏洞:当start == end时(也就是数组只剩最后一个元素需要处理),你仍然执行了两次finalIdx--和两次数组赋值操作。举个例子,假设数组长度是1(比如[-5]),初始finalIdx是0,第一次赋值final[0]没问题,但紧接着finalIdx变成-1,然后你尝试给final[-1]赋值——这直接访问了数组边界外的内存,触发了你看到的unsigned offset overflow错误。

2. 为什么start<end时第一个元素是0?

你犯了一个超级容易忽略的错误:return final;写在了while循环的内部!这意味着循环只执行一次就直接返回结果了,剩下的数组元素根本没被赋值,保持了vector默认的初始值0,所以你看到第一个元素总是0。


修正后的代码

下面是修复了这两个问题的版本,我会标注关键修改点:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int start = 0;
        int end = nums.size()-1;
        vector<int> final(nums.size());
        int finalIdx = final.size()-1;
        int sqr = 0;
        
        while(start <= end){
            if (abs(nums[start]) < abs(nums[end])){
                sqr = nums[end] * nums[end];
                final[finalIdx] = sqr;
                finalIdx--;
                end--;
            } else if (abs(nums[start]) > abs(nums[end])){
                sqr = nums[start] * nums[start];
                final[finalIdx] = sqr;
                finalIdx--;
                start++;
            } else { // 处理相等的情况,合并成else更简洁
                sqr = nums[end] * nums[end];
                final[finalIdx] = sqr;
                finalIdx--;
                // 只有当start和end不是同一个位置时,才处理start的元素
                if (start != end) {
                    final[finalIdx] = sqr;
                    finalIdx--;
                    start++;
                }
                end--; // 不管是否是同一个位置,end都要减1;如果start==end,循环会结束
            }
        }
        return final; // 把return移到循环外面,确保整个数组处理完成
    }
};

关键修改说明

  • 移动return语句:把return final;放到while循环结束之后,这样循环能完整遍历所有元素,完成整个数组的赋值。
  • 修复相等分支的逻辑:当start == end时,只赋值一次,避免越界;只有当start != end时,才赋值两次(因为此时start和end指向两个不同的元素,绝对值相等,平方也相等)。
  • 简化条件判断:把最后一个else if改成else,因为前面两个条件已经覆盖了小于和大于的情况,剩下的必然是相等的情况,代码更简洁。

这样修改后,不管数组长度是奇数还是偶数,都能正确处理,不会出现溢出或者未赋值的问题。

内容的提问来源于stack exchange,提问作者R S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:22:36