Leetcode-18. 4Sum

来源:互联网 发布:酷宝数据 作假 编辑:程序博客网 时间:2024/06/03 21:34

前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN,mcf171专栏。

博客链接:mcf171的博客

——————————————————————————————

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note: The solution set must not contain duplicate quadruplets.

For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.A solution set is:[  [-1,  0, 0, 1],  [-2, -1, 1, 2],  [-2,  0, 0, 2]]
这个题目基本就是3Sum的进一步泛化,简单修改了之后时间效率为O(n^3),两层循环加一个两端逼近。Your runtime beats 3.95% of java submissions.

public class Solution {    public List<List<Integer>> fourSum(int[] nums, int target) {        Arrays.sort(nums);        List<List<Integer>> results = new ArrayList<List<Integer>>();        if(nums.length < 4 ) return new ArrayList();        if(nums.length == 4 && (nums[0] + nums[1] + nums[2] + nums[3]) == target){            List<Integer> result = new ArrayList<Integer>();            result.add(nums[0]);            result.add(nums[1]);            result.add(nums[2]);            result.add(nums[3]);            results.add(result);            return results;        }        for(int i = 0 ; i < nums.length -3; i ++){            if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {                for(int j = i + 1; j < nums.length-2; j ++) {                    if (j == i+1 ||  nums[j] != nums[j-1]) {                        int l = j + 1, r = nums.length - 1;                        while (l < r) {                            List<Integer> result = new ArrayList<Integer>();                            if ((nums[l] + nums[r] + nums[j] + nums[i]) > target ) r--;                            else if ((nums[l] + nums[r] + nums[j] + nums[i]) < target) l++;                            else {                                result.add(nums[l]);                                result.add(nums[r]);                                result.add(nums[i]);                                result.add(nums[j]);                                while (l < r && nums[l] == nums[l + 1]) l++;                                while (l < r && nums[r] == nums[r - 1]) r--;                                l++;                                r--;                            }                            if (result.size() != 0)                                results.add(result);                        }                    }                }            }        }        return results;    }}



0 0