zoukankan      html  css  js  c++  java
  • LeetCode(C++)刷题计划:16-最接近的三数之和

    16-最接近的三数之和

    @Author:CSU张扬
    @Email:csuzhangyang@gmail.com or csuzhangyang@qq.com

    Category Difficulty Pass rate Tags Companies
    algorithms Medium 41.91% array / two-pointers bloomberg

    1. 题目

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

    例如,给定数组 nums = [-121-4], 和 target = 1.
    
    与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
    

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

    2. 解法

    2.1 解法一:双指针法

    1. 与第15题三数之和类似。三数之和是当和为 target 是我们需要的值,此题则是sumtarget|sum - target|最小时,是我们需要的值。
    2. 其余部分和三数之和相同。参考链接:15 - 三数之和

    执行用时: 12 ms, 在所有 cpp 提交中击败了 72.29% 的用户
    内存消耗: 8.7 MB, 在所有 cpp 提交中击败了 87.01% 的用户

    class Solution {
    public:
        int threeSumClosest(vector<int>& nums, int target) {
            if (nums.size() < 3)
                return 0;
            sort(nums.begin(), nums.end());
            int sum;
            long res = INT_MAX;
            for (auto k = 0; k < nums.size() - 2; ++ k) {
                int l = k + 1;
                int r = nums.size() - 1;
                while (l < r) {
                    sum = nums[k] + nums[l] + nums[r];
                    if (abs(sum - target) < abs(res - target))
                            res = sum;
                    if (sum < target) {
                        while (l < r && nums[l] == nums[++ l]) { }
                    }
                    else if (sum > target) {
                        while (l < r && nums[r] == nums[-- r]) { }
                    }
                    else {
                        return target;
                    }
                }
            }
            return res;
        }
    };
    
  • 相关阅读:
    Linux目录结构
    Linux简介
    队列、生产者消费者模型
    Process的几个用法和守护进程
    并发编程(初学)
    网络编程知识点小结
    用socketserver模块实现并发
    粘包问题、解决粘包问题和struct模块
    模拟ssh功能和subprocess模块
    socket 套接字编程
  • 原文地址:https://www.cnblogs.com/MagicConch/p/12179154.html
Copyright © 2011-2022 走看看