题目描述: ( 力扣题库 : 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; } }
- 以上是本篇博客的全部内容, 感谢观看.
-