leetcode 16 最接近的三數隻之和

2021-10-08 19:18:39 字數 1698 閱讀 7968

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

示例:輸入:nums = [-1,2,1,-4], target = 1

輸出:2

解釋:與 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

題目要求找到與目標值 target 最接近的三元組,這裡的「最接近」即為差值的絕對值最小。我們可以考慮直接使用三重迴圈列舉三元組,找出與目標值最接近的作為答案,時間複雜度為 o(n^3)。然而本題的 n最大為 1000,會超出時間限制。

那麼如何進行優化呢?我們首先考慮列舉第乙個元素 a,對於剩下的兩個元素 b 和 c,我們希望它們的和最接近 target−a。對於 b 和 c,如果它們在原陣列中列舉的範圍(既包括下標的範圍,也包括元素值的範圍)沒有任何規律可言,那麼我們還是只能使用兩重迴圈來列舉所有的可能情況。因此,我們可以考慮對整個陣列進行公升序排序,這樣一來:

當我們知道了 b 和 c 可以列舉的下標範圍,並且知道這一範圍對應的陣列元素是有序(公升序)的,那麼我們是否可以對列舉的過程進行優化呢?

答案是可以的。借助雙指標,我們就可以對列舉的過程進行優化。我們用 pb和 pc 分別表示指向 b 和 c 的指標,初始時,pb 指向位置 i+1,即左邊界;pc 指向位置 n-1,即右邊界。在每一步列舉的過程中,我們用 a+b+c來更新答案,並且:

這是為什麼呢?我們對 a+b+c≥target 的情況進行乙個詳細的分析:

如果 a+b+c≥target,並且我們知道 pb到 pc

這個範圍內的所有數是按照公升序排序的,那麼如果 pc不變而 pb向右移動,那麼 a+b+c的值就會不斷地增加,顯然就不會成為最接近 target 的值了。因此,我們可以知道在固定了 pc的情況下,此時的 pb 就可以得到乙個最接近 target 的值,那麼我們以後就不用再考慮 pc了,就可以將 pc 向左移動乙個位置。

同樣地,在 a+b+c < target 時:

如果 a+b+c < target,並且我們知道 pb到 pc這個範圍內的所有數是按照公升序排序的,那麼如果 pb不變而 pc 向左移動,那麼 a+b+c的值就會不斷地減小,顯然就不會成為最接近 target 的值了。因此,我們可以知道在固定了 pb 的情況下,此時的 pc就可以得到乙個最接近 target 的值,那麼我們以後就不用再考慮 pb了,就可以將 pb 向右移動乙個位置。

實際上,pb和 pc就表示了我們當前可以選擇的數的範圍,而每一次列舉的過程中,我們嘗試邊界上的兩個元素,根據它們與 target 的值的關係,選擇「拋棄」左邊界的元素還是右邊界的元素,從而減少了列舉的範圍。這種思路與 11. 盛最多水的容器 中的雙指標解法也是類似的。

小優化本題也有一些可以減少執行時間(但不會減少時間複雜度)的小優化。當我們列舉到恰好等於 target 的 a+b+c 時,可以直接返回 target 作為答案,因為不會有再比這個更接近的值了。

另乙個優化與 15. 三數之和的官方題解 中提到的類似。當我們列舉 a, b, c中任意元素並移動指標時,可以直接將其移動到下乙個與這次列舉到的不相同的元素,減少列舉的次數。

class

solution

right--;}

else

if(sum == target)

else

left++;}

return res;

}}

LeetCode 16 最接近的三數之和

題目傳送門 給定乙個包括 n 個整數的陣列nums和 乙個目標值target。找出nums中的三個整數,使得它們的和與target最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2 ...

leetcode 16 最接近的三數之和

給定乙個包括 n 個整數的陣列nums和 乙個目標值target。找出nums中的三個整數,使得它們的和與target最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2 1 2 顯然...

Leetcode 16 最接近的三數之和

給定乙個包括 n 個整數的陣列 nums 和 乙個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2...