LeetCode - 解题笔记 - 16 - 3Sum Closest

这篇博客介绍了如何使用双指针法解决3SumClosest问题,分别给出了C++和Python的解决方案。通过排序数组并遍历,找到与目标值最接近的三个元素之和,优化了时间复杂度为O(N^2),空间复杂度为O(logN)。
摘要由CSDN通过智能技术生成

3Sum Closest

Solution 1

从题意和数据量上来看,本题基本就是前一个3Sum的变体。有几个主要的区别:输出是和值而非三元组,因此不需要考虑重复问题;考虑对小目标差异而非绝对值,因此需要调整状态维护量。整体还是使用双指针维护遍历方法,但是不需要考虑重复条件,每一个可行元组遍历时,检查和值和目标值的差距,寻找最小差距。

  • 时间复杂度: O ( N 2 ) O(N^2) O(N2) N N N为数字个数
  • 空间复杂度: O ( log ⁡ N ) O(\log N) O(logN) N N N为数字个数
class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        
        int ans = 0, dis = INT_MAX;
        
        for (int posA = 0; posA < nums.size(); ++posA) {
            
            if (posA > nums.size() - 3) {
                break;
            }
            
            int posB = posA + 1;
            int posC = nums.size() - 1;
            
            // 双指针维护
            while (posB < posC) {
                int sum = nums[posA] + nums[posB] + nums[posC];
                
                if (abs(target - sum) < abs(dis)) {
                    dis = target - sum;
                    ans = sum;
                }
                // 负的一项太大了,选一个更小的
                else if (sum < target) {
                    posB++;
                }
                // 正的项太大了,选个更小的
                else {
                    posC--;
                }
            }
        }
        
        return ans;
    }
};

Solution 2

Solution 1的Python实现

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums_ordered = sorted(nums)
        
        dis = 1e5
        
        for posA in range(len(nums_ordered) - 2):
                
            posB = posA + 1
            posC = len(nums_ordered) - 1;
            
            while posB < posC:
                nums_sum = nums_ordered[posA] + nums_ordered[posB] + nums_ordered[posC]
                
                if abs(nums_sum - target) < abs(dis):
                    dis = nums_sum - target
                    ans = nums_sum
                        
                elif nums_sum < target:
                    posB += 1
                    
                else:
                    posC -= 1
                    
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值