zoukankan      html  css  js  c++  java
  • 腾讯//最接近的三数之和

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

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

    参考三数之和,可以用类似方法解决此题;首先进行排序,因为要用到two pointer来遍历找两数之和,只有在从小到大排序之后的结果上,才能根据情况移动left和right。当确定好第一个数字之后,就在剩下的array中找两数之和,再加上第一个数字,用这个temp_sum减去target来得到temp_diff,如果temp_diff比之前的小,那么更新diff和closestSum。利用two pointer 的性质继续调整即可。

    class Solution {
        public int threeSumClosest(int[] nums, int target) {
            Arrays.sort(nums);
            int closestSum = 0;
            int diff = Integer.MAX_VALUE;
            
            for(int i=0;i<nums.length-2;i++){
                int left = i+1;
                int right = nums.length-1;
                while(left<right){
                    int temp_sum = nums[left]+nums[right]+nums[i];
                    int temp_diff = Math.abs(temp_sum-target);
                    if(temp_diff<diff){
                        closestSum = temp_sum;
                        diff = temp_diff;
                    }
                    if(temp_sum < target)
                        left++;
                    else if(temp_sum > target)
                        right--;
                    else
                        return temp_sum;
                }
                
            }
            return closestSum;
        }
        
    }
    class Solution {
    public:
        int threeSumClosest(vector<int>& nums, int target) {
            vector<vector<int>> res;
            sort(nums.begin(),nums.end());
            int size = nums.size();
            int start,end,temp_sum,temp_diff,diff=0x7fffffff;
            int t = 0;
            for(int i = 0;i < size-2;i++){
                start = i+1;
                end = size-1;
                temp_sum = 0 - nums[i];
                while(start<end){
                    temp_sum= nums[start]+nums[end]+nums[i];
                    int temp_diff = abs(temp_sum-target);
                    if(temp_diff<diff){
                        t = temp_sum;
                        diff = temp_diff;
                    }
                    if(temp_sum<target)
                        start++;
                    else if(temp_sum>target)
                        end--;
                    
                    else
                        return temp_sum;
                }
            }
            return t; 
        }
    };
  • 相关阅读:
    使用IIS实现反向代理
    C#管理windows服务
    使用SoapUI测试windows身份验证的webservice
    SQLSERVER2014集群实战——IP引发的坑
    (复活公告??)
    各种trick和细节错误汇总
    emacs常用指令
    随机数据生成与对拍【c++版,良心讲解】
    UVA11019 Matrix Matcher
    HDU4757 Tree
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602506.html
Copyright © 2011-2022 走看看