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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具