LeetCode 259. Three Sum Smaller

Borris發表於2020-02-14

解法一 轉化為 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 協議》,轉載必須註明作者和本文連結

相關文章