详细介绍:LeetCode 刷题【22. 括号生成】
22. 括号生成
自己做(憋不出来)
看题解
解1:暴力解(遍历所有可能)
解2:优化的暴力解
解3:递归
class Solution {
shared_ptr> cache[100] = {nullptr};
public:
shared_ptr> generate(int n) {
if (cache[n] != nullptr)
return cache[n];
if (n == 0) {
cache[0] = shared_ptr>(new vector{""});
} else {
auto result = shared_ptr>(new vector);
for (int i = 0; i != n; ++i) {
auto lefts = generate(i);
auto rights = generate(n - i - 1);
for (const string& left : *lefts)
for (const string& right : *rights)
result -> push_back("(" + left + ")" + right);
}
cache[n] = result;
}
return cache[n];
}
vector generateParenthesis(int n) {
return *generate(n);
}
};
今日总结
告辞,玩不了一点,这怎么想到复杂度这么高的暴力解(脑子都自动排除了),还有都没有考虑n有上限并且输出结果数量有限的问题,之前就屡次被溢出折磨的不成人样。这么玩的话,面向结果编程——列表