1. 程式人生 > >Leetcode第15題:三數值和

Leetcode第15題:三數值和

程式碼以及註釋如下所示:

import java.util.*;
/**
 * 先升序排序,然後用第一重for迴圈確定第一個數字。

 然後在第二重迴圈裡,第二、第三個數字分別從兩端往中間掃。

 如果三個數的sum等於0,得到一組解。

 如果三個數的sum小於0,說明需要增大,所以第二個數往右移。

 如果三個數的sum大於0,說明需要減小,所以第三個數往左移

 1、排序之後天然滿足non-descending order的要求

 2、為了避免重複,在沒有空間要求情況下可以用map,但是也可以跳過重複元素來做。
 */

public class ThreeSum_15 {

    public static void main(String[] args) {
        int []nums = new int[]{-1, 0, 1, 2, -1, -4};
        List<List<Integer>> list = new ThreeSum_15().threeSum(nums);
        for (List<Integer> pl : list){
            for(Integer i : pl){
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }
    List<List<Integer>> list = new ArrayList<List<Integer>>();
    
    public List<List<Integer>> threeSum(int[] nums) {
        
        if (nums == null || nums.length == 0){
            return list;
        }
        //將陣列進行排序
        Arrays.sort(nums);
        int len = nums.length;
        int i = 0, j = 0, k = 0;
        for (; i < len; i++){
            //此時已經確定了第一個數字:nums[i]
            //跳過相同的i
            while (i > 0 && i < len && nums[i] == nums[i-1]){
                i++;
            }
            for (j = i+1, k = len-1; j < k; ){
                //求三個數字的和
                int sum = nums[i] + nums[j] + nums[k];
                if (sum < 0){
                    //小於0的話,sum需要變大,第二個數往右移動
                    j++;
                }else if (sum > 0){
                    //大於0的話,sum需要減小,第三個數往左移動
                    k--;
                }else {
                    //等於0,就將三個數加入一個list集合,並將集合加入到結果集中
                    addList(nums[i], nums[j], nums[k]);
                    j++;
                    k--;
                    //當等於0之後,需要去重
                    while (j < k && nums[j] == nums[j-1]){
                        j++;
                    }
                    while (k > j && nums[k] == nums[k+1]){
                        k--;
                    }
                }
            }
        }
        return list;
    }
    
    private void addList(int first, int second, int third){
        List<Integer> sublist = new ArrayList<Integer>();
        sublist.add(first);
        sublist.add(second);
        sublist.add(third);
        list.add(new ArrayList<>(sublist));
    }


}

相關推薦

Leetcode15數值

程式碼以及註釋如下所示:import java.util.*; /** * 先升序排序,然後用第一重for迴圈確定第一個數字。 然後在第二重迴圈裡,第二、第三個數字分別從兩端往中間掃。 如果三個數的sum等於0,得到一組解。 如果三個數的sum小於0,說明需要增

LeetCodeLeetCode——153Sum

15. 3Sum    My Submissions Question Editorial Solution Total Accepted: 115091 Total Submiss

leetcode 15兩數求和的擴充套件

題目大意:   給定一個包含n個整數的陣列,試問能否找到三個的元素,使得它們的和為零?返回所有可能的元素集合。 說明:   返回的是一個三元不定長陣列的集合,其中的元素不可重複 示例:   輸入vector S:[-1,0,1,2,-1,-4]

LeetCode15--個數的等於0

LeetCode第15題–三個數的和等於0 實現 import java.util.ArrayList; import java.util.HashMap; import java.util

LeetCode15 數之和

i++ while 剪枝 right ger 超時 分析 leetcode 復雜度 /* 給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復的三元組。 註意:答案中不可

LeetCode——53最大欄位

題目: 給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6

leetcode32最長有效括號(遇到一個奇葩的錯誤)

問題描述: 給一個只包含 '(' 和 ')' 的字串,找出最長的有效(正確關閉)括號子串的長度。 對於 "(()",最長有效括號子串為 "()" ,它的長度是 2。 另一個例子 ")()())",最長有效括號子

leetcode72編輯距離

給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。 你可以對一個單詞進行如下三種操作: 插入一個字元 刪除一個字元 替換一個字元 示例 1:

leetcode兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。 請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 O(log(m + n))。 你可以假設 nums1 和 nums2 不會同時為空。 示例

leetcode11盛水最多的容器

給定 n 個非負整數 a1,a2,...,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,

LeetCode23合併K個有序連結串列(JAVA實現)

題目: 我的解答: 思路很簡單,把所有的資料先讀到ArrayList中然後轉到陣列中,然後排序,然後構建新連結串列 程式碼: /** * Definition for singly-linked list. * public class ListNode {

leetcode26刪除排序陣列的重複項

給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。 不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。 給定陣列 nums = [1,1,2], 函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改

leetcode26刪除排序數組的重復項

刪除重復 duplicate 新的 http hit 出現一次 返回 -h color 給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。 不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完

Leetcode 15

vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; if(nums.size(

LeetCode24兩兩交換連結串列的節點(JAVA實現)

題目: 我的解答: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(i

LeetCode最長迴文子串(C語言)

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 解法一:暴力求解法 思想:

leetcode39組合綜合

ret sum solver append else end 包含 color 排序 給定一個無重復元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的數字可以無

LeetCode——198驗證二叉搜尋樹

題目: 給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。 假設一個二叉搜尋樹具有如下特徵: 節點的左子樹只包含小於當前節點的數。 節點的右子樹只包含大於當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜尋樹。 示例 1: 輸入:

LeetCode35搜尋插入位置

題目描述: 給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。 你可以假設陣列中無重複元素。 示例 1: 輸入: [1,3,5,6], 5 輸出: 2 示例 2: 輸入: [1,3,5,6], 2 輸出: 1 示例 3: 輸入: [

LeetCode7Reverse Integer

題目描述:反轉整數輸出,注意的是輸入被假定為一個32位有符號整數。當反整數溢位時,函式應返回0。   今年的華為的實習生招聘筆試的第一個題與這個有點類似,不過華為的是輸入兩個整數,反轉,然後輸出兩個