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 用來記錄差的絕對(duì)值,然后還是要先將數(shù)組排個(gè)序,然后開始遍歷數(shù)組,思路跟那道三數(shù)之和很相似,都是先確定一個(gè)數(shù),然后用兩個(gè)指針 left 和 right 來滑動(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)排過序了,后面的數(shù)字只會(huì)越來越大,就不必再往后比較了,參見代碼如下:
解法二:
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寫一個(gè)web服務(wù)器之GCC項(xiàng)目編譯
本文主要介紹了,如何用C寫一個(gè)web服務(wù)器,Linux下用GCC進(jìn)行項(xiàng)目編譯,對(duì)此感興趣的同學(xué),可以參考下。2021-05-05Visual?Studio中的解決方案中不顯示項(xiàng)目分析
這篇文章主要為大家介紹了Visual?Studio中的解決方案中不顯示項(xiàng)目問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝
這篇文章主要介紹了C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝,運(yùn)行期間才能確定所需內(nèi)存大小,此時(shí)應(yīng)該使用new申請(qǐng)內(nèi)存,下面我們就進(jìn)入文章學(xué)習(xí)具體的操作方法,需要的小伙伴可以參考一下2022-03-03C語(yǔ)言詳解實(shí)現(xiàn)猜數(shù)字游戲步驟
猜數(shù)字是興起于英國(guó)的益智類小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來實(shí)現(xiàn)這個(gè)游戲案例2022-07-07用C語(yǔ)言遞歸實(shí)現(xiàn)火車調(diào)度算法詳解
本文主要介紹了用C語(yǔ)言遞歸實(shí)現(xiàn)火車調(diào)度算法詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C語(yǔ)言結(jié)構(gòu)數(shù)組實(shí)現(xiàn)貪吃蛇小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言結(jié)構(gòu)數(shù)組實(shí)現(xiàn)貪吃蛇小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10C++?STL中五個(gè)常用算法使用教程及實(shí)例講解
本文主要介紹了C++?STL算法中常見的五個(gè)算法的使用教程并附上了案例詳解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11C++從匯編的視角審視對(duì)象的創(chuàng)建問題
這篇文章主要介紹了C++從匯編的視角看對(duì)象的創(chuàng)建,從匯編的視角來看,調(diào)用構(gòu)造器和調(diào)用 “返回對(duì)象” 的函數(shù)是一樣的,從匯編的角度來看,對(duì)象就是一堆數(shù)據(jù)的排列,比如說最普通的對(duì)象就是數(shù)據(jù)成員按照聲明順序直接排列,需要的朋友可以參考下2022-01-01