LeetCode15:三数之和
Posted __rookie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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位置的数改变。
以上是关于LeetCode15:三数之和的主要内容,如果未能解决你的问题,请参考以下文章