求大神给下c++版的完整解法,包括头文件,主函数,类体。
请在文中注明一下具体而详细的思路方法,我学了哈希表和二叉树,一直都不太懂,感觉怪怪的。想要看看大神完整连贯的思路,模仿一下。c++解法,求大神自己敲一下,不要复制粘贴,菜鸡伤不起。
vector> fourSum(vector& nums, int target)
{
int n = nums.size();
QuickSort(nums,0,n-1);
int i,j,k,s,sum,t1,t2;
vector<int> turple;
vector<vector<int>> result;
if(n < 4)
return result;
t1 = nums[0];
for(i=0;i<n-3;i++)
{
if(i && t1 == nums[i])
continue;
t2 = nums[i+1];
for(j=i+1;j<n-2;j++)
{
if(t2 == nums[j] && j >i+1)
continue;
sum = target - nums[i] - nums[j];
k = j+1;
s = n-1;
while(k<s)
{
if(nums[k] + nums[s] == sum)
{
turple.push_back(nums[i]);
turple.push_back(nums[j]);
turple.push_back(nums[k]);
turple.push_back(nums[s]);
result.push_back(turple);
turple.clear();
k++;
s--;
}
else if(nums[k] + nums[s] < sum)
k++;
else
s--;
}
t2 = nums[j];
}
t1 = nums[i];
}
result.erase(unique(result.begin(),result.end()),result.end());
return result;
}
void QuickSort(vector<int>&nums,int low,int high)
{
if(low<high)
{
int pivot = nums[low];
int first = low;
int last = high;
while(first<last)
{
while(nums[last] > pivot && last > first)
{
--last;
}
nums[first] = nums[last];
while(nums[first] <= pivot && last >first)
{
++first;
}
nums[last] = nums[first];
}
nums[first] = pivot;
QuickSort(nums,low,first-1);
QuickSort(nums,first+1,high);
}
else
return;
}
public static List> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List> list = new LinkedList>();
for (int i = 0; i < nums.length - 3; i++) {
if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) {
for (int j = i + 1; j < nums.length - 2; j++) {
if (j==i+1 || (j>i+1 && nums[j] != nums[j - 1])) {
int sum = target - nums[i] - nums[j];
int lo = j + 1;
int hi = nums.length - 1;
while (lo < hi) {
if (nums[lo] + nums[hi] == sum) {
list.add(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi]));
while (lo < hi && nums[lo] == nums[lo + 1]) {
lo++;
}
while (lo < hi && nums[hi] == nums[hi - 1]) {
hi--;
}
;
lo++;
hi--;
} else if (nums[lo] + nums[hi] > sum) {
hi--;
} else if (nums[lo] + nums[hi] < sum) {
lo++;
}
}
}
}
}
}
return list;
}