3sum LTE at leetcode
3sum LTE at leetcode
我在leetcode.com
上做3sum问题蛮力的时间复杂性是o(n^3(。
我使用一个标签,所以我认为时间复杂性是o(n^2(。
但是,我仍然有一个TLE(超过时间限制(
如何加快代码?
以下是我的代码
非常感谢!
class Solution public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ANS;
if(nums.size() < 3) return ANS;
map<int,int*> hashtable;
map<int,int*>::iterator it;
vector<int> ans;
for(int i=0;i < nums.size();i++)
{
for(int j=i+1;j < nums.size();j++ )
{
it = hashtable.find(nums[j]);
if(it != hashtable.end() ) //found target
{
ans.push_back(nums[j]);
ans.push_back((it)->second[0]);
ans.push_back((it)->second[1]);
sort(ans.begin(),ans.end());
ANS.push_back(ans);
ans.clear();
}
else
{
int* temp = new int[2];
temp[0]=nums[i];
temp[1]=nums[j];
hashtable[0-nums[i]-nums[j]]=temp;
}
}
hashtable.clear();
}
sort( ANS.begin(), ANS.end() );
ANS.erase( unique( ANS.begin(), ANS.end() ), ANS.end() );
return ANS;
}};
您的解决方案实际上不是O(n^2)
,它绝对比O(n^2)
昂贵。在没有任何优化的情况下,O(n^2)
中的解决方案不会传递OJ。这是我的解决方案,即O(n^2)
。我在代码中提出了说明。
vector<vector<int> > threeSum(vector<int> &num) {
vector <vector<int> > result;
size_t n = num.size();
if(n < 3) return result;
vector<int> solution(3);
sort(num.begin(), num.end());
for(int i = 0; i < n - 2; ++i) {
int start = i + 1, end = n - 1;
while(start < end) {
int sum = num[start] + num[end] + num[i];
if(sum == 0) {
solution.at(0) = num[i];
solution.at(1) = num[start];
solution.at(2) = num[end];
result.push_back(solution);
// these loops will skip same elements and fasten the algorithm
// while(start < n - 1 and num[start] == num[start + 1]) start++;
// while(end > i + 1 and num[end] == num[end - 1]) end--;
start++, end--;
} else if(sum > 0) {
// while(end > i + 1 and num[end] == num[end - 1]) end--;
end--;
} else {
// while(start < n - 1 and num[start] == num[start + 1]) start++;
start++;
}
}
while(i < n - 1 and num[i] == num[i + 1]) i++;
}
return result;
}
让我知道您是否有任何疑问。希望它有帮助!
相关文章:
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- LeetCode 1011.Binary Search,C++和Python的想法相同,但输出不同
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- CMake 用于设定C++标准的设施 "at least C++NN"
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- CMake Error at modules/videoio/cmake/detect_ffmpeg.cmake:16
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 二叉树级别顺序遍历在leetcode中
- LeetCode 删除 c++ 中的重复项
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- Leetcode 1366:堆缓冲区溢出
- Leetcode:为什么在提交和运行代码上,字符串类的“at”方法的行为不同
- 3sum LTE at leetcode