日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode--15.三数之和

發布時間:2024/1/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 ans

java:

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.三数之和的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。