C++實(shí)現(xiàn)LeetCode(16.最近三數(shù)之和)
[LeetCode] 16. 3Sum Closest 最近三數(shù)之和
Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:
Given array nums = [-1, 2, 1, -4], and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
這道題讓我們求最接近給定值的三數(shù)之和,是在之前那道 3Sum 的基礎(chǔ)上又增加了些許難度,那么這道題讓返回這個(gè)最接近于給定值的值,即要保證當(dāng)前三數(shù)和跟給定值之間的差的絕對(duì)值最小,所以需要定義一個(gè)變量 diff 用來(lái)記錄差的絕對(duì)值,然后還是要先將數(shù)組排個(gè)序,然后開(kāi)始遍歷數(shù)組,思路跟那道三數(shù)之和很相似,都是先確定一個(gè)數(shù),然后用兩個(gè)指針 left 和 right 來(lái)滑動(dòng)尋找另外兩個(gè)數(shù),每確定兩個(gè)數(shù),求出此三數(shù)之和,然后算和給定值的差的絕對(duì)值存在 newDiff 中,然后和 diff 比較并更新 diff 和結(jié)果 closest 即可,代碼如下:
解法一:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int closest = nums[0] + nums[1] + nums[2];
int diff = abs(closest - target);
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; ++i) {
int left = i + 1, right = nums.size() - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
int newDiff = abs(sum - target);
if (diff > newDiff) {
diff = newDiff;
closest = sum;
}
if (sum < target) ++left;
else --right;
}
}
return closest;
}
};
我們還可以稍稍進(jìn)行一下優(yōu)化,每次判斷一下,當(dāng) nums[i]*3 > target 的時(shí)候,就可以直接比較 closest 和 nums[i] + nums[i+1] + nums[i+2] 的值,返回較小的那個(gè),因?yàn)閿?shù)組已經(jīng)排過(guò)序了,后面的數(shù)字只會(huì)越來(lái)越大,就不必再往后比較了,參見(jiàn)代碼如下:
解法二:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int closest = nums[0] + nums[1] + nums[2];
int diff = abs(closest - target);
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; ++i) {
if (nums[i] * 3 > target) return min(closest, nums[i] + nums[i + 1] + nums[i + 2]);
int left = i + 1, right = nums.size() - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
int newDiff = abs(sum - target);
if (diff > newDiff) {
diff = newDiff;
closest = sum;
}
if (sum < target) ++left;
else --right;
}
}
return closest;
}
};
到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(16.最近三數(shù)之和)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)最近三數(shù)之和內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++實(shí)現(xiàn)LeetCode(14.最長(zhǎng)共同前綴)
- C++實(shí)現(xiàn)LeetCode(13.羅馬數(shù)字轉(zhuǎn)化成整數(shù))
- C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
- C++實(shí)現(xiàn)LeetCode(55.跳躍游戲)
- C++實(shí)現(xiàn)LeetCode(45.跳躍游戲之二)
- C++實(shí)現(xiàn)LeetCode(769.可排序的最大塊數(shù))
- C++實(shí)現(xiàn)LeetCode(23.合并k個(gè)有序鏈表)
相關(guān)文章
C語(yǔ)言編程數(shù)據(jù)結(jié)構(gòu)線性表之順序表和鏈表原理分析
本篇文章是C語(yǔ)言編程篇主要為大家介紹了C語(yǔ)言編程中的數(shù)據(jù)結(jié)構(gòu)線性表,文中附含豐富的圖文示例代碼為大家詳解了線性表中的順序表和鏈表,有需要的朋友可以借鑒參考下2021-09-09
C語(yǔ)言斷言函數(shù)assert()的學(xué)習(xí)筆記
在C語(yǔ)言庫(kù)函數(shù)中提供了一個(gè)輔助調(diào)試程序的小型庫(kù),它是由assert()宏組成,本文就詳細(xì)的介紹了一下如何使用,感興趣的可以了解一下2021-11-11
C語(yǔ)言實(shí)現(xiàn)一個(gè)多線程委托模型的示例詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)一個(gè)多線程委托模型,這就是一個(gè)使用C語(yǔ)言實(shí)現(xiàn)多線程委托模型的例子,其中包含boss線程和worker線程,可以處理工作線程的異常情況,需要的朋友可以參考下2023-06-06
Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解
這篇文章主要介紹了Windows程序內(nèi)部運(yùn)行機(jī)制實(shí)例詳解,對(duì)于學(xué)習(xí)Windows程序設(shè)計(jì)來(lái)說(shuō)是非常重要的一課,需要的朋友可以參考下2014-08-08

