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)); } }
相關推薦
Leetcode第15題:三數值和
程式碼以及註釋如下所示:import java.util.*; /** * 先升序排序,然後用第一重for迴圈確定第一個數字。 然後在第二重迴圈裡,第二、第三個數字分別從兩端往中間掃。 如果三個數的sum等於0,得到一組解。 如果三個數的sum小於0,說明需要增
【LeetCode】LeetCode——第15題:3Sum
15. 3Sum My Submissions Question Editorial Solution Total Accepted: 115091 Total Submiss
leetcode 第15題:兩數求和的擴充套件
題目大意: 給定一個包含n個整數的陣列,試問能否找到三個的元素,使得它們的和為零?返回所有可能的元素集合。 說明: 返回的是一個三元不定長陣列的集合,其中的元素不可重複 示例: 輸入vector S:[-1,0,1,2,-1,-4]
LeetCode第15題--三個數的和等於0
LeetCode第15題–三個數的和等於0 實現 import java.util.ArrayList; import java.util.HashMap; import java.util
LeetCode第15題 三數之和
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
leetcode第32題:最長有效括號(遇到一個奇葩的錯誤)
問題描述: 給一個只包含 '(' 和 ')' 的字串,找出最長的有效(正確關閉)括號子串的長度。 對於 "(()",最長有效括號子串為 "()" ,它的長度是 2。 另一個例子 ")()())",最長有效括號子
leetcode第72題:編輯距離
給定兩個單詞 word1 和 word2,計算出將 word1 轉換成 word2 所使用的最少運算元 。 你可以對一個單詞進行如下三種操作: 插入一個字元 刪除一個字元 替換一個字元 示例 1:
leetcode第四題:兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。 請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 O(log(m + n))。 你可以假設 nums1 和 nums2 不會同時為空。 示例
leetcode第11題:盛水最多的容器
給定 n 個非負整數 a1,a2,...,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,
LeetCode第23題:合併K個有序連結串列(JAVA實現)
題目: 我的解答: 思路很簡單,把所有的資料先讀到ArrayList中然後轉到陣列中,然後排序,然後構建新連結串列 程式碼: /** * Definition for singly-linked list. * public class ListNode {
leetcode第26題:刪除排序陣列的重複項
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。 不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。 給定陣列 nums = [1,1,2], 函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改
leetcode第26題:刪除排序數組的重復項
刪除重復 duplicate 新的 http hit 出現一次 返回 -h color 給定一個排序數組,你需要在原地刪除重復出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。 不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完
Leetcode 第15題
vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res; if(nums.size(
LeetCode第24題:兩兩交換連結串列的節點(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” 解法一:暴力求解法 思想:
leetcode第39題:組合綜合
ret sum solver append else end 包含 color 排序 給定一個無重復元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。 candidates 中的數字可以無
LeetCode——第198題:驗證二叉搜尋樹
題目: 給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。 假設一個二叉搜尋樹具有如下特徵: 節點的左子樹只包含小於當前節點的數。 節點的右子樹只包含大於當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜尋樹。 示例 1: 輸入:
LeetCode第35題:搜尋插入位置
題目描述: 給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。 你可以假設陣列中無重複元素。 示例 1: 輸入: [1,3,5,6], 5 輸出: 2 示例 2: 輸入: [1,3,5,6], 2 輸出: 1 示例 3: 輸入: [
LeetCode第7題:Reverse Integer
題目描述:反轉整數輸出,注意的是輸入被假定為一個32位有符號整數。當反整數溢位時,函式應返回0。 今年的華為的實習生招聘筆試的第一個題與這個有點類似,不過華為的是輸入兩個整數,反轉,然後輸出兩個