leetcode 16. 3Sum Closest | 16. 最接近的三数之和(双指针)

雨点打透心脏的1/2处 2022-09-01 14:49 262阅读 0赞

题目

https://leetcode.com/problems/3sum-closest/
在这里插入图片描述

题解

方法1:固定 L,双指针找 M、R

时间复杂度 O(n^2),推荐此方法。
证明不会有元素遗漏,详见官方解答:最接近的三数之和
在这里插入图片描述

方法2:双指针,固定 L、R,找 M

这种方式不会导致遗漏,因为首尾已经能覆盖所有的组合。
时间复杂度O(n^2*log(n))

  1. class Solution {
  2. public int threeSumClosest(int[] nums, int target) {
  3. Arrays.sort(nums);
  4. int dif = Integer.MAX_VALUE;
  5. for (int i = 0; i < nums.length - 2; i++) {
  6. for (int j = i + 2; j < nums.length; j++) {
  7. int t = target - nums[i] - nums[j];
  8. // 固定包含两端点元素,然后在 (L...R) 区间找到与 t 最近的数
  9. int L = i + 1;
  10. int R = j - 1;
  11. int M;
  12. while (L + 1 < R) {
  13. M = (L + R) / 2;
  14. if (nums[M] == t) return target;
  15. else if (nums[M] < t) L = M;
  16. else R = M;
  17. }
  18. if (Math.abs(nums[i] + nums[j] + nums[L] - target) < Math.abs(dif))
  19. dif = nums[i] + nums[j] + nums[L] - target;
  20. if (Math.abs(nums[i] + nums[j] + nums[R] - target) < Math.abs(dif))
  21. dif = nums[i] + nums[j] + nums[R] - target; // nums[i] + nums[j] + nums[R] = target + dif
  22. }
  23. }
  24. return target + dif;
  25. }
  26. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读