LeetCode中等题(二)

题目一:

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

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

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

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

分析:这是一道三元组求和问题

1、首先定义返回的元组类型,List<List<Integer>> ans=new ArrayList<>()

2、对刚开始的数组进行排序,Arrays.sort(nums);

3、通过一个指针遍历整个数组for(int i=0;i<num.lenght;i++)

4、再设置两个指针,分别是l=i+1,r=len-1

5、接下来开始求和进行判断;if(nums[i]+nums[l]+nums[r]==0)将l++,r--;

6、当然应该存入到ans.add(Arrays.asList(nums[i],nums[l],nums[r]))

7、在这个过程可能产生重复,if(nums[i]>0) break,if(i>&&nums[i]==nums[i-1]) continue;while(nums[l]==nums[l+1]) l++; r同样;

8、如果和不同sum<0,l++;sum>0,r--;

9、返回ans;

具体代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        
        List<List<Integer>> ans=new ArrayList<>();
        int len=nums.length;        
        if(nums==null||len<3) return ans;
        
        Arrays.sort(nums);
        
        for(int i=0;i<len;i++)
        {
            int l=i+1,r=len-1;
            if(nums[i]>0) break;
            if(i>0&&nums[i]==nums[i-1]) continue;
            while(l<r)
            {
                int sum=nums[i]+nums[l]+nums[r];
                if(sum==0)
                {
                    ans.add(Arrays.asList(nums[i],nums[l],nums[r]));
                    while(l<r&&nums[l]==nums[l+1]) l++;
                    while(l<r&&nums[r]==nums[r-1]) r--;
                    l++;
                    r--;
                }
                else if(sum<0) l++;
                else if(sum>0) r--;                    
            }
        }        
        return ans;
    }        
}

猜你喜欢

转载自www.cnblogs.com/Optimism/p/11327405.html