标签:IV 无符号 push 数字 while mit 优化 cee bsp
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那里加个类型强转为有符号的
标签:IV 无符号 push 数字 while mit 优化 cee bsp
原文地址:https://www.cnblogs.com/lychnis/p/9250774.html