leetcode 15. 3sum && 16. 3Sum Closest && 18. 4Sum
2017-10-11 10:48
411 查看
题目在这
代码如下:
16题链接
这个不怕碰到重复的,只需记录最接近的值即可
18题点击打开链接
代码如下:
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>>ret; auto sz=nums.size(); if(sz<3)return ret; sort(nums.begin(),nums.end()); for(int i=0;i!=sz-2;++i){ if(i>0 && nums[i]==nums[i-1])continue; //此条件判断i是否重合,试想若固定i,并能找出j和k, //若v[i+1]==v[i],且i+1<j,则产生重合答案. 若找不出答案,则i+1也必然没有结果,所以要跳过 int j=i+1,k=sz-1; while(j<k){ if(nums[i]+nums[j]+nums[k]==0){ vector<int>v{nums[i],nums[j],nums[k]}; ret.push_back(v); //当找到目标,自然可以两头缩小再去查找 ++j; while(j<k &&nums[j]==nums[j-1])++j; --k; while(j<k && nums[k]==nums[k+1])--k; }else if(nums[i]+nums[j]+nums[k]>0){ //一头缩小 --k; }else ++j; } } return ret; } };
16题链接
这个不怕碰到重复的,只需记录最接近的值即可
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { auto sz=nums.size(); if(sz<=3)return accumulate(nums.begin(),nums.end(),0); sort(nums.begin(),nums.end()); int ret=nums[0]+nums[1]+nums[2],sum=0; for(int i=0;i!=sz-2;++i){ int j=i+1,k=sz-1; while(j<k){ sum=nums[i]+nums[j]+nums[k]; if(abs(sum-target)<abs(target-ret))ret=sum; if(sum==target)return ret; sum<target? ++j:--k; } } return ret; } };
18题点击打开链接
class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>>ret; auto sz=nums.size(); if(sz<4)return ret; sort(nums.begin(),nums.end()); for(int i=0;i!=sz-3;++i){ if(i>0 && nums[i]==nums[i-1])continue; if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)break; if(nums[i]+nums[sz-3]+nums[sz-2]+nums[sz-1]<target)continue; for(int j=i+1;j!=sz-2;++j){ if(j>i+1&&nums[j]==nums[j-1])continue; if(nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)break; if(nums[i]+nums[j]+nums[sz-2]+nums[sz-1]<target)continue; int l=j+1,r=sz-1; while(l<r){ if(nums[i]+nums[j]+nums[l]+nums[r]<target)++l; else if(nums[i]+nums[j]+nums[l]+nums[r]>target)--r; else{ ret.push_back(vector<int>{nums[i],nums[j],nums[l],nums[r]}); do{++l;}while(l<r&&nums[l]==nums[l-1]); do{--r;} while(l<r && nums[r]==nums[r+1]); } } } } return ret; } };
相关文章推荐
- 【C++】【LeetCode】15. 3Sum & 16. 3Sum Closest & 18. 4Sum
- Leetcode 1. Two Sum & 15. 3Sum & 16. 3Sum Closest & 18. 4Sum
- 1. Two Sum && 167. Two Sum II - Input array is sorted && 15. 3Sum && 16. 3Sum Closest && 18. 4Sum
- LeetCode之“散列表”:Two Sum && 3Sum && 3Sum Closest && 4Sum
- 【LeetCode】3Sum && 3Sum Closest && 4Sum
- 15. 3Sum && 16 sum closet && 18 4sum
- leetcode 1|167.two sum 1|2 && 3.three sum && 16.3Sum Closest && 18. 4Sum
- leetcode题解-15. 3Sum && 16. 3Sum Closest
- leetcode 3sum closest && 4sum
- LeetCode 3Sum&&3Sum Closest&&4Sum
- leetcode 15 3sum & leetcode 18 4sum
- [LeetCode]15. 3Sum【&16. 3Sum Closest】
- LeetCode#15* 3Sum && LeetCode#16 3Sum Closest && LeetCode#18 4Sum
- LeetCode 16. 3Sum Closest
- leetcode 16. 3Sum Closest
- [leetcode]16. 3Sum Closest
- LeetCode16. 3Sum Closest
- LeetCode 16. 3Sum Closest
- [Leetcode] #1#15#18 2Sum & 3Sum & 4Sum
- LeetCode——3Sum & 3Sum Closest