先对数组排个序。枚举第一个数,然后设两个指针,在第一个数的后半段开始王中间收缩,if sum > target则右指针往左移, if sum < target则左指针往右移。
排序可以大大降低时间复杂度,和3sum那道题有点像,左右指针向中间收缩和木桶装水那道题有点像。
class Solution { public: int threeSumClosest(vector<int>& nums, int target) { if (nums.size() == 3) return nums[0] + nums[1] + nums[2]; sort(nums.begin(),nums.end()); int min = nums[0] + nums[1] + nums[2]; for (int i = 1; i < nums.size()-1; i++) { for (int j = 0, k = nums.size() - 1;;) { if (abs(nums[i] + nums[j] + nums[k]-target)< abs(min -target)) min = nums[i] + nums[j] + nums[k]; if (nums[i] + nums[j] + nums[k] == target) return target; if (nums[i] + nums[j] + nums[k] > target) k--; if (nums[i] + nums[j] + nums[k] < target) j++; if (i == j || i == k) break; } } return min; } };