标签:des style color io os java ar strong for
Given an array S of n integers, are there elements a, b, c, 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:
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)
public class Solution {
public void swap(int[] array, int i, int j)
{
int t = array[i];
array[i] = array[j];
array[j] = t;
}
public void quickSort(int[] array, int start, int end)
{
if (start >= end)
{
return;
}
int middle = (start + end) / 2;
swap(array, start, middle);
int i = start + 1;
while (i <= end)
{
if (array[i] >= array[start])
{
break;
}
i++ ;
}
int j = i + 1;
for (; j <= end;)
{
while (j <= end)
{
if (array[j] < array[start])
{
break;
}
j++ ;
}
if (j <= end)
{
swap(array, i, j);
i++ ;
j++ ;
}
}
i-- ;
if (array[i] < array[start])
{
swap(array, start, i);
}
quickSort(array, start, i - 1);
quickSort(array, i + 1, end);
}
List<List<Integer>> twoSum(int[] array, int startIndex, int endIndex, int dest)
{
List<List<Integer>> result = new LinkedList<List<Integer>>();
while (endIndex > startIndex)
{
int sum = array[startIndex] + array[endIndex];
if (sum == dest)
{
List<Integer> p = new LinkedList<Integer>();
p.add(array[startIndex]);
p.add(array[endIndex]);
result.add(p);
for (startIndex++ ; startIndex <= endIndex; startIndex++ )
{
if (array[startIndex] != array[startIndex - 1])
{
break;
}
}
}
if (sum > dest)
{
endIndex-- ;
}
if (sum < dest)
{
startIndex++ ;
}
}
return result;
}
public List<List<Integer>> fourSum(int[] num, int target)
{
List<List<Integer>> result = new LinkedList<List<Integer>>();
if (num == null || num.length < 4)
{
return result;
}
int[] array = new int[num.length];
for (int i = 0; i < num.length; i++ )
{
array[i] = num[i];
}
quickSort(array, 0, array.length - 1);
int start = 0;
int end = array.length - 1;
for (start = 0; start < array.length - 3;)
{
for (end = array.length - 1; end - start >= 2;)
{
List<List<Integer>> list = twoSum(array, start + 1, end - 1, target - array[start]
- array[end]);
for (List<Integer> p : list)
{
p.add(0, array[start]);
p.add(array[end]);
result.add(p);
}
for(end--;start<end;end--){
if(array[end]!=array[end+1])
break;
}
}
for (start++ ; start < array.length; start++ )
{
if (array[start] != array[start - 1]) break;
}
}
return result;
}
}标签:des style color io os java ar strong for
原文地址:http://blog.csdn.net/jiewuyou/article/details/39250745