数组中3个数的和为指定值。
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.
Example
For example, given array S = {-1 0 1 2 -1 -4}
, A solution set is:
(-1, 0, 1)
(-1, -1, 2)
Note
Solution:
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.
暴力:
public ArrayList<ArrayList<Integer>> threeSum(int[] numbers) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(numbers == null || numbers.length < 3) {
return result;
}
Arrays.sort(numbers);
HashSet<String> set = new HashSet<String>();
for (int i = 0; i < numbers.length - 2; i++) {
for (int j = i + 1; j < numbers.length - 1; j++) {
for (int k = j + 1; k < numbers.length; k++) {
if (numbers[i] + numbers[j] + numbers[k] == 0) {
String key = "" + numbers[i] + numbers[j] + numbers[k];
if(set.add(key)) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(numbers[i]);
list.add(numbers[j]);
list.add(numbers[k]);
result.add(list);
}
}
}
}
}
return result;
}
public static ArrayList<ArrayList<Integer>> sum3(int[] nums, int target) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (nums == null || nums.length < 3) {
return result;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i + 1; j < nums.length; j++) {
int remain = target - nums[i] - nums[j];
if (remain <= nums[j]) {
continue;
}
int index = bs(nums, remain);
if (index >= 0) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[index]);
result.add(list);
}
}
}
return result;
}
private static int bs(int[] nums, int target) {
int start = 0;
int end = nums.length - 1;
int mid;
while (start <= end) {
mid = start + ((end - start) >> 1);
if (target < nums[mid]) {
end = mid - 1;
} else if (target > nums[mid]) {
start = mid + 1;
} else {
return mid;
}
}
return -1;
}
先确定两个,第三个用二分查找。注意排除重复组合。复杂度N^2 logN