Leetcode18.四数之和

文章目录

    • 一、题目
    • 二、代码实现

一、题目

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

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

示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:
输入:nums = [], target = 0
输出:[]

提示:
0 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、代码实现

第一反应就是比较传统的一种方法,排序+双指针,比较容易实现,但是也有很明显的劣端,就是双指针法充其量只能把时间复杂度的指数-1,时间复杂度仍然复杂:O(n^3),不太理想,但是目前在评论区和官方题解里暂时也没找到时间复杂度更好的方法。

算法思想积累:在同时处理几个变化量时,往往是去寻找它们之间的内在联系,然后只去变化一个未知量,切勿同时改变两个甚至多个未知量,否则逻辑会非常复杂。
【注】
在写代码的时候,注意到了不能有重复的,所以我在两个for()循环中都有两个continue语句,然后做到剩余的left和right指针时,一时不知道如何下手···写了一个很复杂的条件判断语句,还做错了,后来从头看了一遍代码···发现其实是只需要判断left指针是否重复即可了,只要left指针不重复,right指针就算重复也不会相等的。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
	Arrays.sort(nums);
    List<List<Integer>> list=new ArrayList<List<Integer>>();
    int n=nums.length;
    for (int i = 0; i < n-3; i++) {
    	if(i>0&&nums[i]==nums[i-1])continue;
		for(int j=i+1;j<n-2;j++) {
			if(j>i+1&&nums[j]==nums[j-1])continue;
			int right=n-1;
			for(int left=j+1;left<right;left++) {
                if(left>j+1&&nums[left]==nums[left-1])continue;
				while(left<right&&nums[i]+nums[j]+nums[right]+nums[left]>target) {
					right--;
				}
				if(left<right&&nums[i]+nums[j]+nums[right]+nums[left]==target) {
			    List<Integer> listTemp=new ArrayList<Integer>();
			    listTemp.add(nums[i]);
			    listTemp.add(nums[j]);
			    listTemp.add(nums[left]);
			    listTemp.add(nums[right]);
			    list.add(listTemp);
				}
			}
		}
	}
    return list;
    }
}

你可能感兴趣的:(Leetcode,四数之和,java8,双指针+排序)