zoukankan      html  css  js  c++  java
  • #leetcode刷题之路16-最接近的三数之和

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

    例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

    与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

    这个题和之前的的三数之和有非常相近之处:

    思路:依然是先排序,然后依次遍历。这里加上点约束来优化,首先是我们要知道,在递增的数组中,越往后遍历三数之和越大,如果(三数之和-target)的值大于当前的差值(正数),那么立刻停止循环。如果等于target则直接返回target。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int threeSumClosest(vector<int>& nums, int target)
    {
        int len = nums.size();
        int dif = INT_MAX;
        int ans = target;
        sort(nums.begin(), nums.end());
        for (int i = 0; i<len - 2; i++)
        {
            for (int j = i + 1; j<len - 1; j++)
            {
                for (int k = j + 1; k<len; k++)
                {
                    //cout << nums[i] << " " << nums[j] << " " << nums[k];
                    int tdif = (nums[i] + nums[j] + nums[k]) - target;
                    if (tdif == 0) return target;
                    if (abs(tdif)<dif)
                    {
                        dif = abs(tdif);
                        ans = nums[i] + nums[j] + nums[k];
                    }
                    //cout << " " <<ans<<endl;
                    if (tdif> dif) break;
                }
            }
        }
        return ans;
    }
    
    int main() {
        vector<int> a = { 1, 2, 4, 8, 16, 32, 64, 128};
        int target=82;
        int ans=threeSumClosest(a,target);
        std::cout << ans << std::endl;
        return 0;
    }

  • 相关阅读:
    【新闻发布系统】登录和注销的实现
    【新闻发布系统】项目文档
    JSP九大内置对象
    JDBC数据库连接技术
    使用SQLyog连接MySQL数据库
    MySql--学习成长过程
    MYSQL--学习记录
    MYSQL
    GIT的使用方法
    java 表单验证
  • 原文地址:https://www.cnblogs.com/biat/p/10516709.html
Copyright © 2011-2022 走看看