算法leetcode|16. 最接近的三数之和(rust重拳出击)
admin
2024-02-11 02:17:19
0次

文章目录

  • 16. 最接近的三数之和:
    • 样例 1:
    • 样例 2:
    • 提示:
    • 原题传送门:
  • 分析
  • 题解
    • rust
    • go
    • c++
    • java
    • typescript
    • python


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

原题传送门:

https://leetcode.cn/problems/3sum-closest/


分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 这道题和【15. 三数之和】很像,但是不再是找一个值,而是要把可能的值都找一遍,最后确定最接近的值,所以不再是直接跳过大于目标,或者小于目标的值。
  • 由于有三个变量,直观的做法还是暴力三层循环,但还是传说会超时。
  • 同样我们先排个序,可以外层循环遍历作为第一个数。
  • 这里用到双指针的思想,如果是找最接近的两数之和,我们可以将两个指针先定位在有序数组的两端,去判断两数之和是否和目标相等,如果相等就是想要的结果;如果大于目标,我们向左移动右面的指针;如果小于目标,我们就向右移动左边的指针。(如果右面的指针一直向左移动就会让两数之和最小,反之如果让左面的指针一直向右移动就会使两数之和最大,这样两个指针的移动方向虽然固定了,但是却不会漏掉某种组合)
  • 扩展到三数之和,由于外层循环已经确定了第一个数的值,内层其实就是最接近的两数之和。

题解

rust

impl Solution {pub fn three_sum_closest(mut nums: Vec, target: i32) -> i32 {let n = nums.len();nums.sort();let mut ans = 23001;for f in 0..n {if f == 0 || nums[f] != nums[f - 1] {let mut s = f + 1;let mut t = n - 1;while s < t {let sum = nums[f] + nums[s] + nums[t];if sum == target {return target;}if (sum - target).abs() < (ans - target).abs() {ans = sum;}if sum > target {let mut t0 = t - 1;while s < t0 && nums[t0] == nums[t] {t0 -= 1;}t = t0;} else {let mut s0 = s + 1;while s0 < t && nums[s0] == nums[s] {s0 += 1;}s = s0;}}}}return ans;}
}

go

func threeSumClosest(nums []int, target int) int {n := len(nums)sort.Ints(nums)ans := 23001abs := func(num int) int {if num < 0 {return -num}return num}for f := 0; f < n; f++ {if f > 0 && nums[f] == nums[f-1] {continue}s, t := f+1, n-1for s < t {sum := nums[f] + nums[s] + nums[t]if sum == target {return target}if abs(sum-target) < abs(ans-target) {ans = sum}if sum > target {t0 := t - 1for s < t0 && nums[t0] == nums[t] {t0 -= 1}t = t0} else {s0 := s + 1for s0 < t && nums[s0] == nums[s] {s0 += 1}s = s0}}}return ans
}

c++

class Solution {
public:int threeSumClosest(vector& nums, int target) {int n = nums.size();sort(nums.begin(), nums.end());int ans = 23001;for (int f = 0; f < n; ++f) {if (f > 0 && nums[f] == nums[f - 1]) {continue;}int s = f + 1;int t = n - 1;while (s < t) {int sum = nums[f] + nums[s] + nums[t];if (sum == target) {return target;}if (abs(sum - target) < abs(ans - target)) {ans = sum;}if (sum > target) {int t0 = t - 1;while (s < t0 && nums[t0] == nums[t]) {t0 -= 1;}t = t0;} else {int s0 = s + 1;while (s0 < t && nums[s0] == nums[s]) {s0 += 1;}s = s0;}}}return ans;}
};

java

class Solution {public int threeSumClosest(int[] nums, int target) {int n = nums.length;Arrays.sort(nums);int ans = 23001;for (int f = 0; f < n; ++f) {if (f > 0 && nums[f] == nums[f - 1]) {continue;}int s = f + 1;int t = n - 1;while (s < t) {int sum = nums[f] + nums[s] + nums[t];if (sum == target) {return target;}if (Math.abs(sum - target) < Math.abs(ans - target)) {ans = sum;}if (sum > target) {int t0 = t - 1;while (s < t0 && nums[t0] == nums[t]) {t0 -= 1;}t = t0;} else {int s0 = s + 1;while (s0 < t && nums[s0] == nums[s]) {s0 += 1;}s = s0;}}}return ans;}
}

typescript

function threeSumClosest(nums: number[], target: number): number {const n = nums.length;nums.sort((a, b) => a - b);let ans = 23001;for (let f = 0; f < nums.length; ++f) {if (f > 0 && nums[f] === nums[f - 1]) {continue;}let s = f + 1;let t = n - 1;while (s < t) {const sum = nums[f] + nums[s] + nums[t];if (sum === target) {return target;}if (Math.abs(sum - target) < Math.abs(ans - target)) {ans = sum;}if (sum > target) {let t0 = t - 1;while (s < t0 && nums[t0] === nums[t]) {t0 -= 1;}t = t0;} else {let s0 = s + 1;while (s0 < t && nums[s0] === nums[s]) {s0 += 1;}s = s0;}}}return ans;
};

python

class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:n = len(nums)nums.sort()ans = 23001for f in range(n):if f > 0 and nums[f] == nums[f - 1]:continues = f + 1t = n - 1while s < t:sum = nums[f] + nums[s] + nums[t]if sum == target:return targetif abs(sum - target) < abs(ans - target):ans = sumif sum > target:t0 = t - 1while s < t0 and nums[t0] == nums[t]:t0 -= 1t = t0else:s0 = s + 1while s0 < t and nums[s0] == nums[s]:s0 += 1s = s0return ans

非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...