zoukankan      html  css  js  c++  java
  • LeetCode 16. 最接近的三数之和

    题目描述

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

    示例:

    输入:nums = [-1,2,1,-4], target = 1
    输出:2
    解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
    

    提示:

    3 <= nums.length <= 10^3
    -10^3 <= nums[i] <= 10^3
    -10^4 <= target <= 10^4
    

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/3sum-closest

    思路解析

    双指针法:
    已知(a + b + c = T),有(b + c = T - a),假设在确定(a)的情况下,在有序数组中使用双指针确定(b)(c)的时间复杂度为(O(n))

    1. 数组排序
    2. 定义最小差距(d_{min})
    3. 固定(a)为数组的首元素(最小)
    4. (b)(a)的下一个元素,令(c)为数组的末元素(最大)
    5. (b + c < T-a),更新(d_{min}),同时(b)后移一个元素,若(b + c > T-a),更新(d_{min}),同时(c)前移一个元素,(b + c = T-a),直接返回(T)
    6. (a)后移一个元素,转到步骤3

    代码实现

    class Solution {
    public:
        int threeSumClosest(vector<int>& nums, int target) {
            std::sort(nums.begin(), nums.end());
            int result = nums[0] + nums[1] + nums[nums.size() - 1];
            int mindif = abs(result - target);
            for(int i = 0; i < nums.size() - 1; i++) {
                if(i > 0 && nums[i] == nums[i - 1]) continue;
                int star = target - nums[i];
                int lo = i + 1;
                int hi = nums.size() - 1;
                while(lo < hi) {
                    int sum = nums[lo] + nums[hi];
                    if(sum > star) {
                        int cdif = abs(star - sum);
                        result = (cdif < mindif) ? sum + nums[i] : result;
                        mindif = (cdif < mindif) ? cdif : mindif;
                        hi--;
                    }
                    else if(sum < star) {
                        int cdif = abs(star - sum);
                        result = (cdif < mindif) ? sum + nums[i] : result;
                        mindif = (cdif < mindif) ? cdif : mindif;
                        lo++;
                    }
                    else{
                        return target;
                    }
                }
            }
            return result;
        }
    };
    
  • 相关阅读:
    数据结构与算法
    c++学习笔记
    红黑树(map与unorder_map)B B+树
    数据库笔记
    多路复用IO:select poll epoll
    https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!
    助教周报(第一轮)——范青青
    第二十二周助教总结(2021.6.28-7.4)
    第二十一周助教总结(2021.6.21-6.27)
    第二十周助教总结(2021.6.14-6.20)
  • 原文地址:https://www.cnblogs.com/xqmeng/p/13737174.html
Copyright © 2011-2022 走看看