2020-06-02 LeetCode 16 最接近的三數之和 C++

題目:面試題64. 求1+2+…+n

 今天每日一題之前不久之前就做過,當時花了一整個下午,印象賊深,思路如下:
https://blog.csdn.net/qq_40405705/article/details/105903614

 然後做了另外一道,16. 最接近的三數之和

題目:給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。

例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).

 思路:首先想到的是三數之和的解法,先排序然後固定下標去左右查找,如果結果一樣就返回target,不然儲存過程中的最接近的值。還需要注意結果應該初始化爲數組其中一個和,不能是0,否則可能出錯。

 時間複雜度O(nlogn)+O(n2)=O(n2)O(nlogn)+O(n^2)=O(n^2),空間複雜度O(1)O(1)

代碼如下:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        //不能初始化爲0
        int ans=nums[0]+nums[1]+nums[2];
        for(int i=1;i<nums.size()-1;i++){
            int l=i-1,r=i+1;
            while(l>=0&&r<nums.size()){
                int sum=nums[l]+nums[i]+nums[r];
                //sum需要增大
                if(sum-target<0) r++;
                ////sum需要減小
                else if(sum-target>0) l--;
                else return sum;
                //儲存最接近的值
                ans=abs(sum-target)<abs(ans-target)?sum:ans;
            }
        }
        return ans;
    }
};

運行結果:
在這裏插入圖片描述

 後面改了下寫法,不固定中間下標而是最左的下標,時間空間複雜度不變,代碼如下:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        int ans;
        for(int i=1;i<nums.size()-1;i++){
            int l=i-1,r=i+1;
            while(l>=0&&r<nums.size()){
                int sum=nums[l]+nums[i]+nums[r];
                if(sum-target<0) r++;
                else if(sum-target>0) l--;
                else return sum;
                ans=abs(sum-target)<abs(ans-target)?sum:ans;
            }
        }
        return ans;
    }
};

運行結果:

2020-06-02_100317
 都不是特別理想,等一個官方題解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章