(java)3sum

来源:互联网 发布:网络mc第一红人大赛 编辑:程序博客网 时间:2024/05/16 02:24

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

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • 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)
思路:本题是典型的k值相加的问题,暴力枚举是每个人都能想到的,但是时间复杂度为o(n^3),太高了,肯定是过不了的,本题可以先对数组排序然后设置一个定点,设置两个指针,一个指向这个定点的下一个位置L,一个指向数组的最后一个位置R,当结果大于target时,R--,当结果小于target时,L++;这样整个算法的时间复杂度是排序的o(nlgn)+o(n^2);
代码如下(已通过leetcode)
public class Solution {List<List<Integer>> lists= new ArrayList<List<Integer>>();    public List<List<Integer>> threeSum(int[] nums) {    if(nums==null) return null;    int length=nums.length;        Arrays.sort(nums);            for(int i=0;i<length-2;i++) {    if(i>0 && nums[i]==nums[i-1]) continue;    findit(nums,i+1,length-1,nums[i]);    }    return lists;    }        public void findit(int[] nums,int begin,int end,int target) {    int l=begin;    int r=end;    while(l<r) {    if(nums[l]+nums[r]+target==0) {    List<Integer> list= new ArrayList<Integer>();    list.add(target);    list.add(nums[l]);    list.add(nums[r]);    lists.add(list);    while(l<r && nums[l]==nums[l+1]) l++;    while(l<r && nums[r]==nums[r-1]) r--;    l++;    r--;    } else {    if(nums[l]+nums[r]+target<0) l++;    else r--;    }    }    }}
0 0
原创粉丝点击