被虐手記 - LeetCode的"三數之和"

剛開始沒有想過度解問題,繞了一大圈,而後在倒數那幾個長數組裏超時了,一時無解。
看了前輩們的提示筆記,才發現思路壓根不對。
對着範例代碼一邊抄一邊調試,最後終於過了;在範例的指引下,也終於摸清了這道題的思路。
圖片描述算法

public static List<List<Integer>> f5(int[] nums) {
    Arrays.sort(nums);
    List<List<Integer>> result = new ArrayList<List<Integer>>();

    for(int i = 0; i < nums.length -2; i++){//一次對比三個數,因此最後一個位置的3個數是length-3, length-2,length-1
        if(i == 0 || i > 0 && nums[i] != nums[i-1]){//跳過與前一次重複的組合
            int left = i + 1;//第二個數,雙指針之一,初始指向nums[i]下一個元素
            int right = nums.length -1;//第三個數,雙指針,初始指向最後一個元素
            int sum = 0 - nums[i];//把三數之和轉換爲兩數之和,簡化問題;把nums[i]取反輕鬆達到目的
            while(left < right){
                if(nums[left] + nums[right] == sum){
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    do{ left++;}while(left < right && nums[left-1] == nums[left]);//跳太重複
                    do{ right--;}while(left < right && nums[right] == nums[right+1]);//跳太重複
                }else if(nums[left] + nums[right] < sum){
                    do{ left++; }while(left < right && nums[left-1] == nums[left]);//跳太重複
                }else if(nums[left] + nums[right] > sum){
                    do{ right--; }while(left < right && nums[right] == nums[right+1]);//跳太重複
                }
            }
        }
    }
    return result;
}

今天的收穫是,學到了拆分問題以簡化實現的難度。
在看範例前,本身的實現簡直不堪入目。數組

LeetCode的算法題,很適合鍛鍊思惟。尤爲代碼寫得多了,浮躁了。
這些算法題能夠帶給我更多刺激。
期待堅持下去那個有質的飛躍的我。spa

相關文章
相關標籤/搜索