leetcode解题报告16. 3Sum Closest

leetcode解题报告16. 3Sum Closest

题目地址

难度是medium

题目描述

和3SUM问题类似,输入一个整数数组,和一个目标整数target。从数组中选择3个数,使得这三个数之和最接近target。要求返回这三个数之和即可,不要求具体返回是哪三个数。默认有且只有一个解。

我的思路

同样地最简单的方法是三层循环暴力遍历即可。但是这一般不是我们相要的答案。
和3sum问题相比,其实我们可以发现这个问题是比3sum问题更简单的。同样是遍历所有三元组,这个问题不需要考虑三元组去重的问题,而且一旦找到等于target的结果即可返回,不要全部遍历完。
所以可以直接套用解决3sum问题时的遍历办法进行遍历。首先为了更好地遍历,对输入数组进行排序,而且我们假定三元组中元素是升序的,具体遍历时,先固定第一个元素(最小元素),再通过左右指针从数组的头尾分别遍历第二和第三个元素。如果当前结果相对target偏小,那么左指针向右移动,如果偏大,那么右指针向左移动,直到左右指针相遇。在整个遍历过程记录最接近的结果。如果遇到等于target的情况,则可以直接返回。
具体看代码。

我的代码

#include <algorithm>

using namespace std;

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        vector<int> my_nums(nums.begin(), nums.end());
        sort(my_nums.begin(), my_nums.end());
        int cur_min = 1000000;
        int ans;
        for (int i = 0; i < my_nums.size() - 2; i++) {
            int left = i + 1;
            int right = my_nums.size() - 1;
            int new_target = target - my_nums[i];
            while (left != right) {
                int cur = new_target - my_nums[left] - my_nums[right];
                if (cur > 0) {
                    left++;
                    if (cur < cur_min) {
                        cur_min = cur;
                        ans = target - cur;
                    }
                } else if (cur < 0) {
                    right--;
                    if (-cur < cur_min) {
                        cur_min = -cur;
                        ans = target - cur;
                    }
                } else {
                    return target;
                }
            }
        }
        return ans;
    }
};

阅读官方题解

没有官方题解,网上题解的思路和我的思路差不多。

思想核心总结

3sum是一类问题,核心是如何高效地遍历三元组。关键点是三元组排序,然后固定第一个元素,对第二和第三个元素通过左右指针从头尾两边向内进行遍历。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值