生活随笔
收集整理的這篇文章主要介紹了
leetcode刷题 15.三数之和
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
分析:
1.特判,對于數(shù)組長度 nn,如果數(shù)組為 null 或者數(shù)組長度小于 33,返回 []。
2.對數(shù)組進行排序。
3.遍歷排序后數(shù)組:
若 nums[i]>0:因為已經(jīng)排序好,所以后面不可能有三個數(shù)加和等于 0,直接返回結(jié)果。對于重復(fù)元素:跳過,避免出現(xiàn)重復(fù)解令左指針 L=i+1,右指針 R=n?1,當(dāng) L<R 時,執(zhí)行循環(huán):當(dāng)nums[i]+nums[L]+nums[R]==0,執(zhí)行循環(huán),判斷左界和右界是否和下一位置重復(fù),去除重復(fù)解。并同時將 L,R 移到下一位置,尋找新的解若和大于 0,說明 nums[R] 太大,R 左移若和小于 0,說明 nums[L] 太小,L 右移
作者:wu_yan_zu
鏈接:https://leetcode-cn.com/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/
來源:力扣(LeetCode)
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ans;if(nums.size()<3) return ans;sort(nums.begin(),nums.end());if(nums[0]>0) return ans;int i=0;while(i<nums.size()){if(nums[i]>0) break;int left = i+1,right = nums.size()-1;while(left<right){long long y = static_cast<long long>(nums[i]);long long x = static_cast<long long>(nums[left]);long long z = static_cast<long long>(nums[right]);if(x+y>0-z)right--;else if(x+y<0-z)left++;else {ans.push_back({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--;}}while(i+1<nums.size()&&nums[i] == nums[i+1])i++;i++;}return ans;}
};
總結(jié)
以上是生活随笔為你收集整理的leetcode刷题 15.三数之和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。