題目描述:
題解:
一、排序+雙指針
類似上一題,思路比較簡單,直接看代碼。
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int rst = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.size(); i++) {
if (i > 0 && nums[i] == nums[i - 1])continue;
int l = i + 1, r = nums.size() - 1;
while (l < r) {
int temp = nums[i] + nums[l] + nums[r];
if (abs(temp - target) < abs(rst - target)) {
rst = temp;
}
if (temp > target)r--;
else if (temp < target)l++;
else return rst;
if (nums[l] == nums[l - 1])l++;
if (r < nums.size() - 1 && nums[r] == nums[r + 1])r--;
}
}
return rst;
}
複雜度分析:兩層循環,時間複雜度O(n2);幾個局部變量,空間複雜度O(1)。