15. 3Sum
Posted lychnis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了15. 3Sum相关的知识,希望对你有一定的参考价值。
class Solution { public: typedef vector<int> VI; typedef vector<VI> VVI; vector<vector<int>> threeSum(vector<int>& nums) { VVI r; VI v; sort(nums.begin(),nums.end()); int sum=0; for(int i=0;i<(int)nums.size()-2;++i) { if(i&&nums[i]==nums[i-1])continue; sum=-nums[i]; int j=i+1,k=nums.size()-1; while(j<k) { if(sum==nums[j]+nums[k]) { v.push_back(nums[i]); v.push_back(nums[j]); v.push_back(nums[k]); r.push_back(v); v.clear(); while(j<k&&nums[j]==nums[j+1])++j; while(j<k&&nums[k]==nums[k-1])--k; ++j; --k; continue; } if(nums[j]+nums[k]<sum)++j; else --k; } } return r; } };
1
本题不能用 N sum的思路去做, 就是那种循环每个数字, push进去递归,然后pop出来那种, 直接timelimitexceed, 因为这里是3sum, 要优化一下;
答案的方法是第一个数字循环, 第二个和第三个一起循环, 所以是O(n*n), 如果用那种N sum写法得是 O(n3)了
2
本题有个坑爹的问题是空数组竟然coredump了.. 看了老半天明明有 i< num.size()-2的判断啊, 怎么会走进去的?????
调试了一下发现size方法返回的是size_t类型, 这个是无符号的, 所以你size-2本来是负数, 因为无符号问题变成了一个超大的数字; 看来编译器是把i转为无符号来跟这个数字比较的, 所以就走进去循环了
改法, 把size那里加个类型强转为有符号的
以上是关于15. 3Sum的主要内容,如果未能解决你的问题,请参考以下文章