今天每日一題之前不久之前就做過,當時花了一整個下午,印象賊深,思路如下:
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,否則可能出錯。
時間複雜度,空間複雜度
代碼如下:
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;
}
};
運行結果:
都不是特別理想,等一個官方題解