1. 程式人生 > 其它 >manjaro中文獻管理工具的安裝及基本配置

manjaro中文獻管理工具的安裝及基本配置

做題思路  or  感想:

  1,我以為二刷以後我就是開無雙了,直到我遇到這道題,細節多的不談,這種三個指標的做法我是真的忘了,三個指標也不談,他甚至還要去重,太繁雜了

  2,用三個指標來代表三個相加的數,且有大小順序  nums[ i ] < nums[ left ] < nums[ right ]

  3,要取完數再去重,不然可能導致  left  >  right

 1 class Solution {
 2 public:
 3     vector<vector<int>> threeSum(vector<int>& nums) {
4 vector<vector<int>>result; //放答案 5 if (nums.size() == 0)return result; 6 sort(nums.begin(), nums.end()); //重要的排序,是下面去重的基礎 7 for (int i = 0; i < nums.size(); i++) { 8 if (nums[i] > 0)return result; //第一個指標指向的一定是三個指標裡面最小的,如果最小的都大於零,那麼全部加起來一定大於零
9 if (i > 0 && nums[i - 1] == nums[i])continue; //第一個指標的去重,這裡必須要 i > 0 的時候再去重,不然會漏掉[-1, -1, 2]這種情況 10 int left = i + 1; 11 int right = nums.size() - 1; 12 while (right > left) { 13 int sum = nums[i] + nums[right] + nums[left];
14 if (sum > 0) { //這兩個指標是可動的 15 right--; 16 } else if (sum < 0) { 17 left++; 18 } else { 19 result.push_back(vector<int>{nums[i], nums[left], nums[right]}); 20 //要取完數再進行兩個指標的去重 21 while (left < right && nums[right - 1] == nums[right])right--; 22 while (left < right && nums[left + 1] == nums[left])left++; 23 //最後的最後還是要雙指標收縮 24 left++; 25 right--; 26 } 27 } 28 } 29 return result; 30 } 31 };