您的位置:首页 > 编程语言 > Java开发

(java)3sum

2015-11-04 13:43 477 查看
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:

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--;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: