在提交代码的时候,一直提示Runtime error,后来发现是对vector操作的问题,内存访问出错,
nums[k] == nums[k - 1]
这一句,当k = 0的时候出错,改成
k > 0 && nums[k] == nums[k - 1]
对3Sum的解决方法如下:
- 对nums进行排序,如果nums.size() < 3,则返回空vector
- k 指向最前排的位置,i 和 j 分别指向 k + 1 和 nums.size()
- i 和 j 分别从前往后进行搜索
- nums[i] + nums[j] + nums[k] = 0 加入vector
- nums[i] + nums[j] + nums[k] > 0 j-- 反之 i++
- 注意去重
代码如下
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res = {};
if(nums.size() < 3)
return res;
sort(nums.begin(), nums.end());
int i = 0, j = 0, k = 0;
for (k = 0; k < nums.size() - 2; k++){
if(nums[k] > 0) break;
if(k > 0 && nums[k] == nums[k - 1]) continue; //k去重
i = k + 1;
j = nums.size() - 1;
while (i < j){
if(nums[k] + nums[i] + nums[j] == 0){
vector<int> temp = {nums[k], nums[i], nums[j]};
res.push_back(temp);
i++;
j--;
while (i < j && nums[i] == nums[i - 1]) //i去重
i++;
while (i < j && nums[j] == nums[j + 1]) //j去重
j--;
} else if(nums[k] + nums[i] + nums[j] < 0){
i++;
while (i < j && nums[i] == nums[i - 1])
i++;
} else if(nums[k] + nums[i] + nums[j] > 0){
j--;
while (i < j && nums[j] == nums[j + 1])
j--;
}
}
}
return res;
}