• Leetcode刷题16. 最接近的三数之和


    给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

    返回这三个数的和。

    假定每组输入只存在恰好一个解。

    示例 1:

    输入:nums = [-1,2,1,-4], target = 1
    输出:2
    解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。


    示例 2:

    输入:nums = [0,0,0], target = 1
    输出:0
     

    提示:

    3 <= nums.length <= 1000
    -1000 <= nums[i] <= 1000
    -104 <= target <= 104


    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/3sum-closest
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    1. class Solution {
    2. public int threeSumClosest(int[] nums, int target) {
    3. // return threeSumClosestI(nums, target);
    4. return threeSumClosestII(nums, target);
    5. }
    6. //方法二:双指针
    7. //与三数之和思路类似,先排序,利用双指针优化空间
    8. //遍历过程中对于每个三数之和都要比较它和目标值的差值的绝对值
    9. //时间复杂度O(N^2),空间复杂度O(1)
    10. private int threeSumClosestII(int[] nums, int target) {
    11. if (nums == null || nums.length == 0) {
    12. return 0;
    13. }
    14. //先排序
    15. Arrays.sort(nums);
    16. int min = nums[0] + nums[1] + nums[2];
    17. for (int i = 0; i < nums.length - 2; i++) {
    18. if (i > 0 && nums[i] == nums[i - 1]) {
    19. continue;
    20. }
    21. int left = i + 1, right = nums.length - 1;
    22. while (left < right) {
    23. int sum = nums[i] + nums[left] + nums[right];
    24. if (sum == target) {
    25. return target;
    26. }
    27. if (Math.abs(min - target) > Math.abs(sum - target)) {
    28. min = sum;
    29. }
    30. if (sum > target) {
    31. right--;
    32. // while (left < right && nums[right] == nums[right + 1]) {
    33. // right--;
    34. // }
    35. } else {
    36. left++;
    37. //left先+1之后,和它前面的left-1进行比较,若后+1,则和它后面的left+1进行比较
    38. // while (left < right && nums[left] == nums[left - 1]) {
    39. // left++;
    40. // }
    41. }
    42. }
    43. }
    44. return min;
    45. }
    46. //方法一:暴力解法,穷举所有可能
    47. //时间复杂度O(N^3),空间复杂度O(1)
    48. private int threeSumClosestI(int[] nums, int target) {
    49. if (nums == null || nums.length == 0) {
    50. return 0;
    51. }
    52. int minDiff = Integer.MAX_VALUE;
    53. int result = nums[0] + nums[1] + nums[2];
    54. for (int i = 0; i < nums.length - 2; i++) {
    55. for (int j = i + 1; j < nums.length - 1; j++) {
    56. for (int k = j + 1; k < nums.length; k++) {
    57. int sum = nums[i] + nums[j] + nums[k];
    58. int diff = Math.abs(sum - target);
    59. if (diff < minDiff) {
    60. minDiff = diff;
    61. result = sum;
    62. }
    63. }
    64. }
    65. }
    66. return result;
    67. }
    68. }

  • 相关阅读:
    【深入浅出Java并发编程指南】「源码分析篇」透析ThreadLocal线程私有区域的运作机制和源码体系
    ffmpeg v4l2集成分析
    java毕业设计校园二手交易网站mybatis+源码+调试部署+系统+数据库+lw
    CSS从入门到精通——动画:CSS3动画执行次数和逆向播放
    VueComponent 笔记
    Redis常用数据类型
    Kubernetes技术与架构-14
    [Vue]大屏界面自适应-transform: scale() translate(x, y)
    【校招VIP】前端JS语言之CSS基础属性
    自然辩证法与人工智能:一种哲学与技术的对话
  • 原文地址:https://blog.csdn.net/Bonbon_wen/article/details/128072317