15.三数之和(LeetCode)(中等)

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

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

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

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

 

其实和题目16类似稍做修改即可,时间复杂度O(n^2)

主要变动为

不可重复要处理,

相近改为相同要处理

class Solution {
    public List<List<Integer>> threeSum(int[] nums) 
    {
              Arrays.sort(nums);//java自带快排
        List<List<Integer>> result = new LinkedList<>();
        
        int target=0;
        int sum;   	       
        for(int i=0;i<=nums.length-3;i++)//减3因为最后三个数
        {
        	if(i==0||(i>0&&nums[i]!=nums[i-1]))//我用这个麻烦的方法是因为我暂时不知道如何和list里面的数组是否equal,只能在进去分析前把相同的数剃掉
        	{
        		int start=i+1;//第二个数的指针从i后一位开始
        		int end=nums.length-1;//第三个数的指针从最后一位开始
        		while(start<end)
        		{
        			if(start==i+1||(start>i+1&&nums[start]!=nums[start-1]))
        			{
        				if(end==nums.length-1||(end<nums.length-1&&nums[end]!=nums[end+1]))
        				{
        					sum=nums[i]+nums[start]+nums[end];
        					//如果sum比target小,那么让sum大一点,即start加1
        					if(sum<target)
        					{
        						start=start+1;
        					}
        					//如果sum比target小,那么让sum大一点,即start加1
        					else if(sum>target)
        					{
        						end=end-1;
        					}
        					//一样可以直接输出,因为题目假定唯一最近
        					else 
        					{
        						result.add(new LinkedList<>(Arrays.asList(nums[i],nums[start],nums[end])));
        						start+=1;
        					}
        				}
        				else {end=end-1;}
        			}
        			else {start=start+1;}
        		}
        	}
        }
        return result;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章