LeetCode--15.三数之和
給你一個整數數組?nums?,判斷是否存在三元組?[nums[i], nums[j], nums[k]]?滿足?i != j、i != k?且?j != k?,同時還滿足?nums[i] + nums[j] + nums[k] == 0?。請你返回所有和為?0?且不重復的三元組。
注意:答案中不可以包含重復的三元組。
示例 1:
輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]
解釋:nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。不同的三元組是 [-1,0,1] 和 [-1,-1,2] 。注意,輸出的順序和三元組的順序并不重要。
示例 2:
輸入:nums = [0,1,1]
輸出:[]
解釋:唯一可能的三元組和不為 0 。
示例 3:
輸入:nums = [0,0,0]
輸出:[[0,0,0]]
解釋:唯一可能的三元組和為 0 。
3<=nums.length<=3000,? ?-10^5<=nums[i]<=10^5
1、排序+雙指針
基本思路:先給數組排序,然后枚舉第一個數,后兩個數用雙指針尋找。詳細注釋我會寫在代碼里面
時間O(N2),N為數組長度
空間O(logN),忽略存儲答案的空間,額外的排序的空間復雜度為 O(log?N)
python:
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:n = len(nums)# 數組排序nums.sort()# ans變量用來存儲結果ans = []# 如果數組長度小于3,或者排序后第一個數大于0、最后一個數小于0,# 那么一定找不到這樣的三元組,則直接返回空數組if n < 3 or nums[0] > 0 or nums[n - 1] < 0:return ans# 排序后數組第一個數和最后一個數都等于0,說明整個數組都是0,返回固定值if nums[0] == 0 and nums[n - 1] == 0:return [[0, 0, 0]]# 枚舉第一個數for i in range(n-2):# 如果枚舉的數字不是第一個數,且這個數和前面的數重復了,跳出本次循環if i > 0 and nums[i] == nums[i - 1]:continue# 如果枚舉的數大于0,跳出本次循環if nums[i] > 0:break# 定義左右指針left = i + 1right = n - 1# 開始查找while left < right:sum = nums[i] + nums[left] + nums[right]# 和為0,則獲取一組結果if sum == 0:ans.append([nums[i], nums[left], nums[right]])# 增加左指針,注意要跳過相同的數while left < right and nums[left] == nums[left+1]:left += 1# 縮短右指針,跳過相同數while left < right and nums[right] == nums[right-1]:right -= 1# 不存在重復數字,直接縮短left += 1right -= 1# 否則和大于0,縮短右指針elif sum > 0:right -= 1# 否則增加左指針else:left += 1return ansjava:
class Solution {public List<List<Integer>> threeSum(int[] nums) {int n = nums.length;Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<>();if (nums[0] > 0 || nums[n-1] < 0) {return ans;}if (nums[0] == 0 && nums[n-1] == 0) {ans.add(new ArrayList<>(Arrays.asList(0, 0, 0)));return ans;}for (int i = 0; i < n; i++) {if (i > 0 && nums[i] == nums[i-1]) {continue;}if (nums[i] > 0) {break;}int left = i + 1;int right = n - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum == 0) {ans.add(new ArrayList<>(Arrays.asList(nums[i], nums[left], nums[right])));while (left < right && nums[left] == nums[left+1]) {left++;}while (left < right && nums[right] == nums[right-1]) {right--;}left++;right--;}else if (sum > 0) {right--;}else {left++;}}}return ans;} }總結
以上是生活随笔為你收集整理的LeetCode--15.三数之和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jz2440 插入U盘 挂载
- 下一篇: 怎么将heic转换格式,如何打开heic