题目:
思路:
请见三数之和点击打开链接
- 因为是求四个数字之和,所以将i作为第一个数字,其他剩下的三个索引分别为left,mid,right,然后在i的遍历数组的时候,剩下的操作思路和三数之和是一样的。其中需要注意的是,因为求的是四个数字的和,所以left,mid,right分别就已经占用了三个数,所以i只能遍历到 nums.size()-3的前一个下标处。同理,在left遍历的时候,只能遍历到nums.size()-2的位置(因为剩下的两个位置要留给mid,right)。
- 此时还是比较nums[mid]+nums[right]和tem的数值,那么tem的数值根据:nums[left]+nums[mid]+nums[right]+nums[i]=target来推导出,其中nums[right]+nums[mid]=target-nums[left]-nums[i].所以可以推出tem = target-nums[left]-nums[i]。然后再根据大小,来移动mid,right就可以了。
代码:
class Solution {
public:
void sort(vector<int>& nums)
{
int temp = 0;
int len = nums.size();
for(int i=0; i<len; i++)
{
for(int j=i+1; j<len; j++)
{
if(nums[i] > nums[j])
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
}
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums);
int len = nums.size();
int i,left,mid,right;
int tem,tem_i;
vector <int>vi(4);
vector<vector<int> > arry;
for(i=0; i<(len-3); i++)
{
tem_i = target - nums[i];
if(i>0 && nums[i]==nums[i-1])
continue;
for(left=i+1; left<len-2; left++)
{
tem = tem_i - nums[left];
mid = left+1;
right = nums.size()-1;
if(left>i+1 && nums[left]==nums[left-1])
continue;
while(mid<right)
{
if(nums[mid]+nums[right] == tem)
{
int m = nums[mid];
int r = nums[right];
vi[0] = nums[i];
vi[1] = nums[left];
vi[2] = nums[mid];
vi[3] = nums[right];
arry.push_back(vi);
while((mid<right) && (m==nums[++mid]))
{
continue;
}
while((mid<right) && (r==nums[--right]))
{
continue;
}
}
else if(nums[mid]+nums[right]<tem)
{
mid++;
}
else{
right--;
}
}
}
}
return arry;
}
};