算法leetcode|16. 最接近的三数之和(rust重拳出击)

Posted 二当家的白帽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法leetcode|16. 最接近的三数之和(rust重拳出击)相关的知识,希望对你有一定的参考价值。


文章目录


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<i32>, 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 := 23001

	abs := 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-1
		for 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 - 1
				for s < t0 && nums[t0] == nums[t] 
					t0 -= 1
				
				t = t0
			 else 
				s0 := s + 1
				for s0 < t && nums[s0] == nums[s] 
					s0 += 1
				
				s = s0
			
		
	

	return ans


c++

class Solution 
public:
    int threeSumClosest(vector<int>& 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 = 23001
        for f in range(n):
            if f > 0 and nums[f] == nums[f - 1]:
                continue
            s = f + 1
            t = n - 1
            while 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 - 1
                    while s < t0 and nums[t0] == nums[t]:
                        t0 -= 1
                    t = t0
                else:
                    s0 = s + 1
                    while s0 < t and nums[s0] == nums[s]:
                        s0 += 1
                    s = s0
        return ans


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


以上是关于算法leetcode|16. 最接近的三数之和(rust重拳出击)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 16最接近的三数之和

LeetCode 16. 最接近的三数之和

LeetCode:最接近的三数之和16

leetcode 16:最接近的三数之和

16. 最接近的三数之和

[leetcode 16] 最接近的三数之和