241. 为运算表达式设计优先级(经典分治法)

和归并排序的方法很相似。
将加括号的问题转化为,对于每个运算符号,先执行两端的表达式,然后在根据这个运算符进行运算。
两端的表达式的结果也不是唯一的,其中某一端的表达式的结果也是 多个像之前的分割操作的子集的和。
注意这里字符里面没有运算符的情况。然后就是这里的stoi也很重要,字符串转化为int类型。

  1. class Solution {
  2. public:
  3. vector<int> diffWaysToCompute(string expression) {
  4. vector<int> ways;
  5. for(int i = 0; i < expression.length(); i++){
  6. char c = expression[i];
  7. if(c == '+' || c == '-' || c == '*') {//以运算符为分割线前后都为括号!!!
  8. vector<int> left = diffWaysToCompute(expression.substr(0, i));
  9. vector<int> right = diffWaysToCompute(expression.substr(i+1));
  10. for(const int & l : left){
  11. for(const int & r : right){
  12. switch(c) {
  13. case '+' : ways.push_back(l + r); break;
  14. case '-' : ways.push_back(l - r); break;
  15. case '*' : ways.push_back(l * r); break;
  16. }
  17. }
  18. }
  19. }
  20. }
  21. if(ways.empty()) ways.push_back(stoi(expression));//如果当前没有运算符,那么就是完全由数字组成的。
  22. return ways;
  23. }
  24. };

932. 漂亮数组(实在是难)

image.png
image.png
如果你有n的漂亮数组,想知道2n的漂亮数组,那么通过将n2-1作为前部(奇数),n2作为后半部分(偶数)。那么就能够的到2n的漂亮数组。
image.png

  1. class Solution {
  2. public:
  3. unordered_map<int,vector<int> > mp;
  4. vector<int> beautifulArray(int N) {
  5. return f(N);
  6. }
  7. vector<int> f(int N) {
  8. vector<int> ans(N, 0);
  9. int t = 0;
  10. if (mp.find(N) != mp.end()) {
  11. return mp[N];
  12. }
  13. if (N != 1) {
  14. for (auto x : f((N+1)/2)){
  15. ans[t++]= 2 * x - 1;
  16. }
  17. for (auto x : f(N/2)){
  18. ans[t++] = 2 * x;
  19. }
  20. }else {
  21. ans[0] = 1;
  22. }
  23. mp[N] = ans;
  24. return ans;
  25. }
  26. };