最接近的三数之和-java

题目描述: ( 力扣题库 : 16 )

  • 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。

    •  

  • 思路分析: 
    • 这段代码的解题思想是首先对给定的整数数组进行排序,以便更好地利用有序数组的性质。然后,通过遍历数组并固定一个数作为三个数中的第一个数,使用双指针技术来找到剩下两个数,使它们的和最接近目标值。在双指针的过程中,我们不断计算当前三个数的和,并根据与目标值的差值来更新最接近目标值的和。通过移动左指针和右指针,我们可以调整剩下两个数的选择,以便逐步逼近目标值。最终,算法会返回找到的最接近目标值的三个数的和。这种方法的关键在于利用排序后的数组结构和双指针技术,以高效地寻找最优解.
  • 解题方法: 双指针法​​​​​​​
    • 1.排序数组
      • 首先对输入的数组进行排序,这样可以更方便地进行后续操作。排序后相同的元素会相邻,方便去除重复计算。

    • 2.初始化最接近目标值的和
      • 将前三个数的和作为初始的最接近目标值的和,这里假设数组长度大于等于3。

    • 3.遍历数组
      • 从数组的第一个元素开始遍历到倒数第三个元素,因为要找三个数的和。在遍历过程中,对于重复的元素跳过,避免重复计算相同的解。

    • 4.双指针法
      • 在每次固定一个数后,使用双指针法来找到剩下两个数,使它们的和最接近目标值。左指针指向当前元素的下一个元素,右指针指向数组的最后一个元素。

    • 5.计算当前三个数的和
      • 计算当前固定数、左指针和右指针指向的三个数的和。

    • 6.更新最接近目标值的和
      • 如果当前和等于目标值,直接返回目标值。否则,比较当前和目标值的绝对差与已知最接近目标值的和的绝对差,更新最接近目标值的和。

    • 7.移动指针
      • 根据当前和与目标值的大小关系,移动左右指针。如果当前和小于目标值,则左指针右移;如果当前和大于目标值,则右指针左移。

    • 8.返回结果
      • 最终返回最接近目标值的和。

    • 这个算法的时间复杂度为O(n^2),其中n是数组的长度,因为排序的时间复杂度为O(nlogn),外层循环需要O(n)的时间,内部双指针循环也需要O(n)的

  •     以下是完整的代码( 已在力扣通过 ) ( 用时 : 12 ms,  消耗内存分布 : 42.01MB)
    • 
      class Solution {
          public int threeSumClosest(int[] nums, int target) {
              Arrays.sort(nums);
              int closestSum = nums[0] + nums[1] + nums[2];
      
              for (int i = 0; i < nums.length - 2; i++) {
                  if (i > 0 && nums[i] == nums[i - 1]) {
                      continue;
                  }
                  int left = i + 1;
                  int right = nums.length - 1;
      
                  while (left < right) {
                      int currentSum = nums[i] + nums[left] + nums[right];
                      if (currentSum == target) {
                          return target;
                      }
                      if (Math.abs(currentSum - target) < Math.abs(closestSum - target)) {
                          closestSum = currentSum;
                      }
                      if (currentSum < target) {
                          left++;
                      } else {
                          right--;
                      }
                  }
              }
      
              return closestSum;
          }
      }
      ​​​​​​​ 
    •                                  以上是本篇博客的全部内容, 感谢观看.
  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值