Leetcode日记(6)

本文详细解析了3Sum与3SumClosest两个经典算法问题的解决方案,通过排序和双指针技巧实现高效查找,避免重复解并找到最接近目标值的三数之和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3Sum

问题描述

        Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

分析

       先对数组进行排序,然后固定左边值a,在它的右边夹逼求解是否存在中间值b和右边值c,满足a+b+c=0。

解答

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        int len = nums.size();
        if (len < 3)
            return result;
        sort(nums.begin(), nums.end());
        if (nums[0] > 0 || nums[len - 1] < 0)
            return result;
        for (int i = 0; ; i++) 
        {
            int front = -nums[i];
            int mid = i + 1;
            int back = len - 1;
            for ( ;mid < back; ) 
            {
                if (nums[back] < 0)
                        break;
                int sum = nums[mid] + nums[back];
                if (sum < front)
                    mid++;
                else if (sum > front)
                    back--;
                else 
                {
                    vector<int> findone(3, 0);
                    findone[0] = nums[i];
                    findone[1] = nums[mid++];
                    findone[2] = nums[back--];
                    result.push_back(findone);
                    while (nums[mid] == findone[1] && mid < back) 
                        mid++;
                    while (nums[back] == findone[2] && mid < back) 
                        back--;
                }
            }
            while (i + 1 < len && nums[i] == nums[i + 1])
                i++;
            if (nums[i] > -1)
                break;
        }
        return result;
    }
};

3Sum Closest

问题描述

      Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
       For example, given array S = {-1 2 1 -4}, and target = 1.
       The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

分析

       和上一道题相类似的解法。

解答

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int len = nums.size();
        sort(nums.begin(), nums.end());
        int result = nums[0] + nums[1] + nums[2];
        for (int front = 0; front < len - 2; front++)
        {
            int mid = front + 1;
            int back = len - 1;
            int sum = 0;
            for ( ;mid < back; )
            {
                sum = nums[front] + nums[mid] + nums[back];
                if (sum == target)
                    return sum;
                else if (sum < target)
                    mid++;
                else
                    back--;
                if (abs(target - sum) < abs(target - result))
                    result = sum;
            }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值