leetcode 540上的运行时错误。已排序数组中的单个元素

时间:2019-12-26 05:54:38

标签: c++ arrays

我正在使用c ++执行leetcode 540。Single Element in a Sorted Array。问题是:给您一个仅由整数组成的排序数组,其中每个元素只出现两次,一个元素只出现一次。找到只出现一次的单个元素。

这里是一个例子:

Input: [1,1,2,3,3,4,4,8,8]
Output: 2

我再次遇到运行时错误:

Runtime Error Message:
AddressSanitizer: heap-buffer-overflow on address 0x602000000034 at pc 0x0000004056da bp 0x7ffcd2cff910 sp 0x7ffcd2cff908

这是我的代码,非常容易理解。

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        int n = nums.size();
        int i = 1;
        int output;
        if(nums[0] != nums[1])
            return nums[0];
        if(nums[n-1] != nums[n-2])
            return nums[n-1];
        for(i = 1; i < n-1; i++)
            {
                if(nums[i]!=nums[i-1] && nums[i]!=nums[i+1])
                {
                    output = nums[i];
                    break;
                }
            }
        return output;
    }
};

我真的希望有人能帮助我。我几次遇到这个问题,不知道发生了什么。

2 个答案:

答案 0 :(得分:2)

在这一部分:

if(nums[0] != nums[1])
    return nums[0];
if(nums[n-1] != nums[n-2])
    return nums[n-1];

如果nums的大小为0或1怎么办?我认为您应该在代码中添加一些完整性检查,例如检查输入向量的大小以处理0或1个元素的极端情况。

我添加了此条件,现已接受。

if(n == 1)
   return nums[0];

答案 1 :(得分:0)

如果从0开始而不是从1开始迭代,则可以大大简化:

int singleNonDuplicate(vector<int>& nums) 
{
   for( size_t i = 0; i < nums.size(); i += 2 )
       if( i + 1 == nums.size() || nums[i] != nums[i+1] ) 
           return nums[i];
   // if we reach here then input is wrong
   throw std::runtime_error( "wrong input" );
}

您不需要任何先决条件。

注意:在现场,解决方案要求为O(log n),因此尽管此循环在逻辑上可以正常工作,但您需要使用二进制搜索的更复杂解决方案,因为此使用循环的解决方案为O(n)。