leetcode15_三数之和
一、题目

二、分析
主要难点在于去重,而且补充元素去重,而是排列去重,这个用哈希来实现其实我感觉比较困难,后来看他们推荐的算法,还是采用的双指针逼近来完成这道题目。
算法流程如下

算法复杂度分析如下

三、代码
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> final_result; //升序排列 sort(nums.begin(), nums.end()); int length = nums.size(); if(length<3) return final_result; //遍历 for(int i=0; i<length; i++){ //大于0,结束本次循环 if(nums[i]>0) break; //跳过重复元素 if(i>0){ if(nums[i] == nums[i-1]) continue; } int left = i+1; int right = length-1; //执行循环s //std::cout<<"i : "<<i<<std::endl; while(left<right){ //如果满足条件 if(nums[i]+nums[left]+nums[right]==0){ vector<int> pre = {nums[i], nums[left], nums[right]}; //std::cout<<"result : "<<nums[i]<< nums[left]<< nums[right]<<std::endl; final_result.push_back(pre); //去重 while(left<right && nums[left]==nums[left+1]){ left++; //std::cout<<"left: "<<left<<std::endl; } while(left<right && nums[right]==nums[right-1]){ right--; //std::cout<<"right: "<<right<<std::endl; } left++; right--; } else if(nums[i]+nums[left]+nums[right]<0) left++; else right--; //std::cout<<"index : "<<i<<" "<<left<<" "<<right<<std::endl; } } return final_result; } };
四、比较
在去重nums[i]的时候,我是这样写的,
if(i>0){ while(nums[i] == nums[i-1]) i++; }
而不是上面那样写的,这样看起来也是可以的,但是会保存。
后来我发现是在面对例子[0,0,0,0]这种情况的时候,它会一直遍历到index 4,这样访问的地址就出错了。所以还是上面的方法好一点,直接跳过本次循环
纵一苇之所如,临万顷之茫然。

浙公网安备 33010602011771号