image.png

思路

标签:排序和双指针
本题目因为要计算三个数,如果靠暴力枚举的话时间复杂度会到 O(n^3),需要降低时间复杂度

  1. 首先进行数组排序,时间复杂度 O(nlogn)
  2. 在数组 nums 中,进行遍历,每遍历一个值利用其下标i,形成一个固定值 nums[i]
  3. 再使用前指针指向 start = i + 1 处,后指针指向 end = nums.length - 1 处,也就是结尾处
  4. 根据 sum = nums[i] + nums[start] + nums[end] 的结果,判断 sum 与目标 target 的距离,如果更近则更新结果 ans
  5. 同时判断 sum 与 target 的大小关系,因为数组有序,如果 sum > target 则 end—,如果 sum < target 则 start++,如果 sum == target 则说明距离为 0 直接返回结果
  6. 整个遍历过程,固定值为 n 次,双指针为 n 次,时间复杂度为 O(n^2)总时间复杂度:O(nlogn) + O(n^2) = O(n^2)
  1. public int threeSumClosest(int[] nums, int target) {
  2. Arrays.sort(nums);
  3. int ans = nums[0]+nums[1]+nums[2];
  4. for(int i=0;i<nums.length;i++){
  5. int start = i+1,end = nums.length-1;
  6. while(start<end){
  7. int sum = nums[start]+nums[end]+nums[i];
  8. if(Math.abs(target-sum)<Math.abs(target-ans))
  9. ans = sum;
  10. if(sum<target)
  11. start++;
  12. else if(sum>target)
  13. end--;
  14. else
  15. return ans;
  16. }
  17. }
  18. return ans;
  19. }