LeetCode15:三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

这题基本思想是三个循环嵌套,但是需要判断产生的三元组是否重复。

在此基础上改进,通过观察可以发现,第二层循环和第三层循环其实可以合并。如果当前三个位置为a,b,c,如果当前和大于0,则需要减小c;如果当前和小于0,则需要增大b。可以发现b和c的循环其实加起来是O(n)的,这样修改为2层循环,时间复杂度也降为O(n)。

 1 class Solution {
 2 public:
 3     vector<vector<int>> threeSum(vector<int>& nums) {
 4         vector<vector<int>> ret;
 5         sort(nums.begin(),nums.end());
 6         int a,b,c,n=nums.size(),target;
 7         for(int a=0;a<n-2;a++){
 8             if(a!=0 && nums[a]==nums[a-1])
 9                 continue;
10             target=-nums[a];
11             c=n-1;
12             for(b=a+1;b<c;b++){
13                 if(b!=a+1 && nums[b]==nums[b-1])
14                     continue;
15                 while(nums[b]+nums[c]>target && c>b+1){
16                     c--;
17                 }
18                 if(nums[b]+nums[c]==target)
19                     ret.push_back({nums[a],nums[b],nums[c]});
20                 else if(c==b+1 && nums[b]+nums[c]>target)
21                     break;
22             }
23         }
24 
25 
26         return ret;
27     }
28 };

此外在每次修改a和b的时候,都需要判断当前是否跟上一个位置重复,即每次向前移动都要保证移动到a或b位置的数改变。

猜你喜欢

转载自www.cnblogs.com/rookiez/p/13192494.html