[LeetCode]15. 3Sum【&16. 3Sum Closest】

来源:互联网 发布:sql索引超出数组界限 编辑:程序博客网 时间:2024/06/01 07:25

15 . 3Sum
Medium
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

回溯法:
41ms:

public List<List<Integer>> threeSum(int[] nums) {       List<List<Integer>> res = new ArrayList<>();       if(nums==null||nums.length==0) return res;       List<Integer> cur = new LinkedList<>();       Arrays.sort(nums);       threesumdfs(res,cur,nums,0,0);       return res;}private void threesumdfs(List<List<Integer>> res,List<Integer> cur,int[] nums, int sum,int start){    if(cur.size()==3){        if(sum==0) res.add(new ArrayList<Integer>(cur));        return ;    }    for(int i=start;i<nums.length;i++){        cur.add(nums[i]);        threesumdfs(res,cur,nums,sum+nums[i],i+1);        while(i<nums.length-1){            if(nums[i+1]==cur.get(cur.size()-1))                i++;            else                break;        }        cur.remove(cur.size()-1);    }}

参考:
[LeetCode]39.Combination Sum&40.Combination Sum II&216.Combination Sum III&377.Combination Sum IV

两端夹逼:

public List<List<Integer>> threeSum(int[] nums){    List<List<Integer>> res = new ArrayList<>();    if(nums==null||nums.length<3) return res;    Arrays.sort(nums);    for(int i=0;i<nums.length-2;i++){        if(i>0&&nums[i]==nums[i-1]) continue;        int j=i+1,k=nums.length-1;        while(j<k){            if(nums[i]+nums[j]+nums[k]<0){                j++;                while(j<k&&nums[j]==nums[j-1]) j++;            }else if(nums[i]+nums[j]+nums[k]>0){                k--;                while(j<k&&nums[k]==nums[k+1]) k--;            } else{                List<Integer> cur = new ArrayList<>();                cur.add(nums[i]);                cur.add(nums[j]);                cur.add(nums[k]);                res.add(cur);                j++;k--;                while(j<k&&nums[j]==nums[j-1]&&nums[k]==nums[k+1]) j++;            }        }        }    return res;}

参考:
1. Two Sum&167. Two Sum II - Input array is sorted

16 . 3Sum Closest
Medium

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

For example, given array S = {-1 2 1 -4}, and target = 1.The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
0 0
原创粉丝点击