15. 三数之和

做题思路  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 };
复制代码

 

posted @   北原春希  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示