- 241. 为运算表达式设计优先级(经典分治法)">241. 为运算表达式设计优先级(经典分治法)
- 932. 漂亮数组(实在是难)">932. 漂亮数组(实在是难)
241. 为运算表达式设计优先级(经典分治法)
和归并排序的方法很相似。
将加括号的问题转化为,对于每个运算符号,先执行两端的表达式,然后在根据这个运算符进行运算。
两端的表达式的结果也不是唯一的,其中某一端的表达式的结果也是 多个像之前的分割操作的子集的和。
注意这里字符里面没有运算符的情况。然后就是这里的stoi也很重要,字符串转化为int类型。
class Solution {
public:
vector<int> diffWaysToCompute(string expression) {
vector<int> ways;
for(int i = 0; i < expression.length(); i++){
char c = expression[i];
if(c == '+' || c == '-' || c == '*') {//以运算符为分割线前后都为括号!!!
vector<int> left = diffWaysToCompute(expression.substr(0, i));
vector<int> right = diffWaysToCompute(expression.substr(i+1));
for(const int & l : left){
for(const int & r : right){
switch(c) {
case '+' : ways.push_back(l + r); break;
case '-' : ways.push_back(l - r); break;
case '*' : ways.push_back(l * r); break;
}
}
}
}
}
if(ways.empty()) ways.push_back(stoi(expression));//如果当前没有运算符,那么就是完全由数字组成的。
return ways;
}
};
932. 漂亮数组(实在是难)
如果你有n的漂亮数组,想知道2n的漂亮数组,那么通过将n2-1作为前部(奇数),n2作为后半部分(偶数)。那么就能够的到2n的漂亮数组。
class Solution {
public:
unordered_map<int,vector<int> > mp;
vector<int> beautifulArray(int N) {
return f(N);
}
vector<int> f(int N) {
vector<int> ans(N, 0);
int t = 0;
if (mp.find(N) != mp.end()) {
return mp[N];
}
if (N != 1) {
for (auto x : f((N+1)/2)){
ans[t++]= 2 * x - 1;
}
for (auto x : f(N/2)){
ans[t++] = 2 * x;
}
}else {
ans[0] = 1;
}
mp[N] = ans;
return ans;
}
};