首页 > 其他分享 >LeetCode 16.最接近的三数之和(中等)

LeetCode 16.最接近的三数之和(中等)

时间:2022-11-25 13:39:07浏览次数:56  
标签:right target nums int 三数 16 索引 目标值 LeetCode

题目描述:

给你一个长度为 ​​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
  • - <= target <=

题目分析:

这道题基本和 ​​LeetCode 15.三数之和(中等)​​ 一样,只不过需要多加个差值计算,判断当前和是否接近目标值。具体的思路还是使用双指针,先定义一个变量存放结果值,对数组进行排序,定义左右两个指针,循环数组。先固定一个数,微调左右指针指向的元素,计算三个索引上的数之和,这里要加个比较,判断当前和与目标值之间的差值是否比旧的结果值与目标值之间的差值更小,如果更小说明该和更接近目标值,要对结果进行更新。

题解:

执行用时: 5 ms

内存消耗: 38 MB

class Solution {
public int threeSumClosest(int[] nums, int target) {
// 获取数组长度
int length = nums.length;
// 因题目条件已经给了数组必定大于等于 3 所以小于 3 的情况不用考虑
// 当数组长度刚好等于 3
if (length == 3) {
// 直接返回这三个元素的和
return nums[0] + nums[1] + nums[2];
}
// 数组长度大于 3 首先对数组进行排序
Arrays.sort(nums);
// 定义一个结果值
int res = 10000;
// 循环遍历数组
for (int i = 0; i < length; ++i) {
// 如果当前固定数和前一个相同
if (i > 0 && nums[i] == nums[i - 1]) {
// 直接跳过该数 目的是为了去重
continue;
}
// 定义左索引
int left = i + 1;
// 定义右索引
int right = length - 1;
// 当左索引小于右索引值时遍历右区间
while (left < right) {
// 计算固定索引上的值与左右索引上的值之和
int sum = nums[i] + nums[left] + nums[right];
// 如果和刚好等于目标值 直接返回即可
if (sum == target) {
return target;
}
// 计算当前和与目标值 结果值与目标值的绝对值
// 如果当前和与目标值的差值还比旧的结果值与目标值的差还小
// 说明当前和更接近目标值
if (Math.abs(sum - target) < Math.abs(res - target)) {
// 更新结果值
res = sum;
}
// 如果当前和大于目标值
if (sum > target) {
// 要使当前和更接近目标值
// 就得使和更小 所以右索引要左移
// 获取右索引左移一位的索引值
int j = right - 1;
// 当新的右索引值大于左索引值 并且 新的右索引上的值与旧的右索引上的值相同
while (left < j && nums[j] == nums[right]) {
// 跳过该值 目的同样是为了去重
--j;
}
// 更新右索引值
right = j;
} else {
// 否则当前和小于等于目标值
// 要使当前和更接近目标值
// 就得使和更大 所以左索引要右移
// 获取左索引右移一位的索引值
int j = left + 1;
// 当新的左索引值小于右索引值 并且 新的左索引上的值与旧的左索引上的值相同
while (j < right && nums[j] == nums[left]) {
// 跳过该值 目的同样是为了去重
++j;
}
// 更新左索引值
left = j;
}
}
}
// 返回结果
return res;
}
}

题目来源:力扣(LeetCode)




标签:right,target,nums,int,三数,16,索引,目标值,LeetCode
From: https://blog.51cto.com/u_15891283/5886556

相关文章

  • LeetCode 739.每日温度(中等)
    题目描述:请根据每日​​气温​​​列表​​temperatures​​​,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用​​0​​来代替......
  • LeetCode 20.有效的括号(简单)
    题目描述:给定一个只包括​​'('​​​,​​')'​​​,​​'{'​​​,​​'}'​​​,​​'['​​​,​​']'​​​ 的字符串​​s​​,判断字符串是否有效。有效字符串需满足:......
  • LeetCode 155.最小栈(简单)
    题目描述:设计一个支持​​push​​​,​​pop​​​,​​top​​操作,并能在常数时间内检索到最小元素的栈。​​push(x)​​——将元素x推入栈中。​​pop()​​ —......
  • LeetCode 769.最多能完成排序的块(中等)
    题目描述:数组​​arr​​​是​​[0,1,...,arr.length-1]​​的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果......
  • LeetCode 240.搜索二维矩阵II(中等)
    题目描述:编写一个高效的算法来搜索 ​​m x n​​​ 矩阵​​matrix​​​中的一个目标值​​target​​。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的......
  • LeetCode 232.用栈实现队列(简单)
    题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(​​push​​​、​​pop​​​、​​peek​​​、​​empty​​):实现​​MyQueu......
  • LeetCode 448.找到所有数组中消失的数字(简单)
    题目描述:给你一个含​​n​​​个整数的数组​​nums​​​,其中​​nums[i]​​​在区间​​[1,n]​​​内。请你找出所有在​​[1,n]​​​范围内但没有出现......
  • LeetCode 48.旋转图像(中等)
    题目描述:给定一个​​n × n​​​的二维矩阵 ​​matrix​​​表示一个图像。请你将图像顺时针旋转​​90​​度。你必须在原地旋转图像,这意味着你需要直接修改......
  • LeetCode 260.只出现一次的数字III(中等)
    题目描述:给定一个整数数组​​nums​​,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。进阶:你的算法......
  • LeetCode 476.数字的补数(简单)
    题目描述:给你一个正整数​​num​​,输出它的补数。补数是对该数的二进制表示取反。示例1:输入:num=5输出:2解释:5的二进制表示为101(没有前导零位),其补数为010。所以......