我正在使用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;
}
};
我真的希望有人能帮助我。我几次遇到这个问题,不知道发生了什么。
答案 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)。