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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

三数之和(Leetcode第15题)

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三数之和(Leetcode第15题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;//定義result為容器里的容器,相當于當容器里還有一個小容器,跟題目最后輸出的是符合數組相吻合。sort(nums.begin(), nums.end());//sort類,用于排序,從nums數組的第一個元素到最后一個元素// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一個元素已經大于零,那么無論如何組合都不可能湊成三元組,直接返回結果就可以了if (nums[i] > 0) {return result;}// 錯誤去重方法,將會漏掉-1,-1,2 這種情況/*if (nums[i] == nums[i + 1]) {continue;}*/// 正確去重方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重復邏輯如果放在這里,0,0,0 的情況,可能直接導致 right<=left 了,從而漏掉了 0,0,0 這種三元組/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/if (nums[i] + nums[left] + nums[right] > 0) {right--;} else if (nums[i] + nums[left] + nums[right] < 0) {left++;} else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重邏輯應該放在找到一個三元組之后while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;//去重的原理:因為是已經排過序了,重復的序列必然是緊挨著的,我們只需在找到的結果中把指針回退一位即可。(自己動手花花邏輯就能理解了)// 找到答案時,雙指針同時收縮right--;left++;}}}return result;} };

整體的解題思路:

第一步是定義result,定義的是容器里的容器,用于返回的是數組對

第二步是排序,用的是sort方法,從小到大的順序

第三步就是指針的移動方式,拿這個nums數組來舉例,首先將數組排序,然后有一層for循環,i從下表0的地方開始,同時定一個下表left?定義在i+1的位置上,定義下表right?在數組結尾的位置上。

依然還是在數組中找到?abc?使得a?+?b?+c?=0,我們這里相當于??a?=?nums[i]?b?=?nums[left]??c?=?nums[right]。

接下來如何移動left?和right呢,?如果nums[i]?+?nums[left]?+?nums[right]?>?0??就說明?此時三數之和大了,因為數組是排序后了,所以right下表就應該向左移動,這樣才能讓三數之和小一些。

如果?nums[i]?+?nums[left]?+?nums[right]?<?0?說明?此時?三數之和小了,left?就向右移動,才能讓三數之和大一些,直到left與right相遇為止。

最重要的是去重:去重一共分為兩部分,找結果的前提是排序了數組,第一部分是在找到符合條件的值之后,就把其地址存儲在容器里,這時候再移動I指針,如果下一個是與原來的值是相等的,那么這就是一種重復的情況。

第二部分是當找到符合條件的值以后,再移動left活著right的時候,旁邊的值是一致的,那么就是重復的情況,這時候就要倒回去繼續判斷了。

題目所涉及的知識點內容可參考以下博主:

一個是容器(vector),具體的一些內容可參考下面博主:https://blog.csdn.net/wkq0825/article/details/82255984

第二個知識點是sort函數,具體內容參考下面博主:https://blog.csdn.net/Architect_chaser/article/details/88322605

總結

以上是生活随笔為你收集整理的三数之和(Leetcode第15题)的全部內容,希望文章能夠幫你解決所遇到的問題。

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