回cheatsheet: leetcode-cheatsheet
15. 3Sum 題目描述 給你一個包含n
個整數的陣列nums
,判斷nums
中是否存在三個元素a,b,c
,使得a + b + c = 0
?請你找出所有滿足條件且不重複的三元組。
解法 通常透過排序加上雙指針來解決
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public List<List<Integer>> threeSum(int [] nums) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); for (int i = 0 ; i < nums.length && nums[i] <= 0 ; ++i) if (i == 0 || nums[i - 1 ] != nums[i]) { twoSumII(nums, i, res); } return res; }void twoSumII(int [] nums, int i, List<List<Integer>> res) { int lo = i + 1 , hi = nums.length - 1 ; while (lo < hi) { int sum = nums[i] + nums[lo] + nums[hi]; if (sum < 0 ) { ++lo; } else if (sum > 0 ) { --hi; } else { res.add(Arrays.asList(nums[i], nums[lo++], nums[hi--])); while (lo < hi && nums[lo] == nums[lo - 1 ]) ++lo; } } }
商業邏輯應用 這種算法可以用於數據分析、風險管理等領域,例如在金融市場分析中,尋找影響股票價格的因素組合,或在風險評估中尋找可能導致損失的多種因素。
時間複雜度與空間複雜度
11. Container With Most Water 題目描述 給定一個整數陣列height
,其中height[i]
代表點(i, 0)
和點(i, height[i])
之間會形成的垂直線。找出其中的兩條線,使得它們與x
軸共同形成的容器可以容納最多的水。
解法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class Solution { public int maxArea (int [] height) { int left = 0 , right = height.length - 1 ; int maxArea = 0 ; while (left < right) { int width = right - left; int h = Math.min (height[left], height[right]); maxArea = Math.max (maxArea, width * h); if (height[left] < height[right]) { left++; } else { right--; } } return maxArea; } }
商業邏輯應用 這種算法可以應用於資源分配和空間優化問題,如在建築設計和貨物包裝領域,通過最大化利用有限空間來增加效率和效益。
時間複雜度與空間複雜度
時間複雜度:O(n),其中n為陣列的長度。
空間複雜度:O(1)。
125. Valid Palindrome Valid Palindrome - LeetCode 給定一個字串,驗證它是否是迴文串,考慮只到字母和數字字符,可以忽略字母的大小寫。
解法思路是設定兩個指針,一個在字串的開始left
,一個在字串的結尾right
。移動指針時跳過非字母和數字字符,然後比較left
和right
指向的字符是否相等,不等則返回false
。
1 2 3 4 5 6 7 8 9 10 11 12 13 public boolean isPalindrome(String s) { int left = 0 , right = s.length() - 1 while (left < right ) { while (left < right && !Character.isLetterOrDigit(s.charAt(left ))) left ++ while (left < right && !Character.isLetterOrDigit(s.charAt(right ))) right -- if (Character.toLowerCase(s.charAt(left )) != Character.toLowerCase(s.charAt(right ))) { return false } left ++ right -- } return true }
Two Sum II - Input Array Is Sorted - LeetCode
解法思路是設定兩個指針,一個在陣列的開始left
,一個在陣列的結尾right
。如果numbers[left] + numbers[right]
小於target
,則left++
;如果大於target
,則right--
;相等時,就找到了答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public int [] twoSum(int [] numbers, int target ) { int left = 0 , right = numbers.length - 1 ; while (left < right) { int sum = numbers[left] + numbers[right]; if (sum == target ) { return new int [] { left + 1 , right + 1 }; } else if (sum < target ) { left++; } else { right--; } } return new int [] { -1 , -1 }; }