16. 最接近的三数之和 @Python @Go

原题

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

思路

双指针

复杂度

时间:O(n * n)
空间:O(1)

Python代码

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        ans = float('inf')
        for i in range(len(nums)):
            # 去重
            if i >= 1 and nums[i] == nums[i-1]:
                continue
            left, right = i + 1, len(nums) - 1
            while left < right:
                cur_sum = nums[i] + nums[left] + nums[right]
                if cur_sum == target:
                    return target
                if abs(cur_sum - target) < abs(ans - target):
                    ans = cur_sum 
                if cur_sum < target:
                    left += 1 
                else:
                    right -= 1 
        return ans         

Go代码

func threeSumClosest(nums []int, target int) int {
	sort.Ints(nums)
	ans := math.MaxInt32
	for i, _ := range nums {
		// 去重
		if i >= 1 && nums[i] == nums[i-1] {
			continue
		}
		left, right := i+1, len(nums)-1
		for left < right {
			cur_sum := nums[i] + nums[left] + nums[right]
			if cur_sum == target {
				return target
			}
			if math.Abs(float64(cur_sum-target)) < math.Abs(float64(ans-target)) {
				ans = cur_sum
			}
			if cur_sum < target {
				left++
			} else {
				right--
			}
		}
	}
	return ans
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值