这道题,还是那道3Sum的加强版。。。再外面套一层循环就可以了,另外,每一层循环外面,都要加一行循环,把接下来相同的元素跳过,代码如下:
class Solution {
public:
vector<vector<int> > fourSum(vector<int>& nums, int target) {
vector<vector<int> > result;
if(nums.empty())return result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i)
{
for(int j = i + 1; j < nums.size(); j++){
int left = j + 1, right = nums.size() - 1;
while(left < right){
int tempSum = nums[i] + nums[j] + nums[left] + nums[right];
if(tempSum == target){
vector<int> t;
t.push_back(nums[i]);
t.push_back(nums[j]);
t.push_back(nums[left]);
t.push_back(nums[right]);
result.push_back(t);
left++; right--;
while(left + 1 < nums.size() && nums[left] == t[2])
left++;
while(right - 1 > 0 && nums[right] == t[3])
right--;
}
else if(tempSum < target)left++;
else right--;
}
while(j + 1 < nums.size() && nums[j + 1] == nums[j])j++;
}
while(i + 1 < nums.size() && nums[i + 1] == nums[i])i++;
}
return result;
}
};
当四个数的和为target时,那里有一行 left++; right--;,这个其实是不需要的,后面的循环会自己执行一次,但是为什么还要写呢?因为这句能让程序快10ms。。。。不知道为什么,有大神指点一下吗