From 92f8cd1aaaf49aad6015e598437456af95654026 Mon Sep 17 00:00:00 2001 From: wenruimeng Date: Wed, 26 Nov 2014 08:37:12 -0500 Subject: [PATCH] 3sum time exceeding problem --- C++/chapLinearList.tex | 43 +++++++++++++++++++++++++++++++ C++/leetcode-cpp.synctex.gz(busy) | 0 2 files changed, 43 insertions(+) create mode 100644 C++/leetcode-cpp.synctex.gz(busy) diff --git a/C++/chapLinearList.tex b/C++/chapLinearList.tex index d5a020f3..3b691705 100644 --- a/C++/chapLinearList.tex +++ b/C++/chapLinearList.tex @@ -579,6 +579,49 @@ \subsubsection{代码} }; \end{Code} +\subsubsection{分析} +先排序,然后左右夹逼,复杂度 $O(n^2)$。 +需要返回没有duplicate的结果。每次寻找新结果就排除那些可能重复的数字,外层i如果与之前一样则进行下一个, +同理对里层夹逼的两个数也是这样来避免。 +\subsubsection{代码} +\begin{Code} +class Solution { +public: +vector > threeSum(vector &num){ + sort(num.begin(), num.end()); + vector > result; + if(num.size() < 3) return result; + for(int i = 0; i < num.size() - 2; ++i){ + if(i && num[i] == num[i - 1]) continue; + int j = i + 1; + int k = num.size() - 1; + while(j < k){ + if(num[i] + num[j] + num[k] == 0){ + result.push_back({num[i], num[j], num[k]}); + ++j, --k; + while(num[j] == num[j - 1] && num[k] == num[k + 1] && j < k){ + ++j, --k; + } + } + else if(num[i] + num[j] + num[k] < 0){ + ++j; + while(num[j] == num[j - 1] && j < k){ + ++j; + } + } + else{ + --k; + while(num[k] == num[k + 1] && j < k){ + --k; + } + } + } + } + return result; + } +}; +\end{Code} + \subsubsection{相关题目} \begindot diff --git a/C++/leetcode-cpp.synctex.gz(busy) b/C++/leetcode-cpp.synctex.gz(busy) new file mode 100644 index 00000000..e69de29b