今天在做力扣 四数之和时遇到一个问题:
下面for(int i = 0; i < nums.size() - 3; i++)
中,当nums.size()的值小于等于3时,依然能进入循环体内;
这是因为nums.size()返回的是一个无符号 unsigned long long int
型, 当nums.size() - 3 小于0时, 由于无符号变量不可能为负数,所以要对 nums.size() - 3 的值进行
2
n
2^n
2n模运算以防止其为负数。
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<vector<int>> result;
for(int i = 0; i < nums.size() - 3; i++)
{
if(nums[i] > target && nums[i] > 0) break;//剪枝
if(i > 0 && nums[i] == nums[i-1])continue;//去第一个数重
for(int j = i+1; j < nums.size() - 2;j++)
{
if(nums[i] + nums[j] > target && nums[i] + nums[j] > 0) break;//剪枝
if(j > i+1 && nums[j] == nums[j-1])continue;
int lowPoint = j + 1;
int highPoint = nums.size() - 1;
while(lowPoint < highPoint)
{
if((long)nums[i] + nums[j] + nums[lowPoint] + nums[highPoint] > target)
highPoint--;
else if((long)nums[i] + nums[j] + nums[lowPoint] + nums[highPoint] < target)
lowPoint++;
else{
result.push_back({nums[i], nums[j], nums[lowPoint], nums[highPoint]});
while(lowPoint < highPoint && nums[lowPoint] == nums[lowPoint + 1]) lowPoint++;
while(lowPoint < highPoint && nums[highPoint] == nums[highPoint - 1]) highPoint--;
lowPoint++;
highPoint--;
}
}
}
}
return result;
}
};