解法一 轉化為 Two Sum 問題
思路
先將陣列進行排序。對於每一個元素nums[i],尋找位於該元素後的所有 sum 小於 target - nums[i] 的數對。如何計算個數?
舉個例子:[1,3,4,5,7],target = 13.
首先 nums[i] = 1; 那麼二和問題要尋找的兩數之和應該小於12。nums[j] 從索引 i 後面的元素3開始,nums[k]從末端的7開始。nums[j] + nums[k] 小於12。這樣的數有幾對呢?
我們可以知道,如果nums[j]不變,有[3,4],[3,5],[3,7]這三對,即(k - j)對。此時我們累加這個數值,將i加一。這時有[4,5],[4,7]這兩對。按照這樣的演算法,一共得到有六對滿足條件的數。
程式碼
public class Solution {
public int threeSumSmaller(int[] nums, int target) {
int result = 0;
Arrays.sort(nums);
for(int i = 0; i <= nums.length-3; i++) {
int lo = i+1;
int hi = nums.length-1;
while(lo < hi) {
if(nums[i] + nums[lo] + nums[hi] < target) {
result += hi - lo;
lo++;
} else {
hi--;
}
}
}
return result;
}
}
複雜度分析
- 時間複雜度
- O(n^2)
- 空間複雜度
- O(1)
解法二 Binary Search
思路
程式碼
複雜度分析
- 時間複雜度
- 最好情況
- 最壞情況
- 平均情況
- 空間複雜度
Takeaway
本作品採用《CC 協議》,轉載必須註明作者和本文連結