分治算法的简单学习笔记
1、算法解释
分治算法——分与治
- 把原问题分为子问题
- 再把子问题进行处理合并
- 分治问题可以通过主定理求得时间复杂度
- 自上而下的分治结合memoization,避免重复遍历相同的子问题
主定理
2、表达式问题
解题思路
- 遍历字符串
- 遇到操作符,就将左右两边的字符串,分别当作 两个表达式
Java解答
简单递归
class Solution {
public List<Integer> diffWaysToCompute(String expression) {
if (expression == null || expression.length() == 0) {
return new ArrayList<Integer>();
}
List<Integer> res = new ArrayList<>();
int num = 0;
int index = 0;
while (index < expression.length() && !isOperation(expression.charAt(index))) {
num = num * 10 + expression.charAt(index) - '0';
index++;
}
if (index == expression.length()) {
res.add(num);
return res;
}
for (int i = 0; i < expression.length(); i++) {
if (isOperation(expression.charAt(i))) {
List<Integer> res1 = diffWaysToCompute(expression.substring(0, i));
List<Integer> res2 = diffWaysToCompute(expression.substring(i+1));
for (int j = 0; j < res1.size(); j++) {
for (int k = 0; k < res2.size(); k++) {
char op = expression.charAt(i);
res.add(caculate(res1.get(j), op, res2.get(k)));
}
}
}
}
return res;
}
private int caculate(int num1, char op, int num2) {
switch (op) {
case '+':
return num1+num2;
case '-':
return num1-num2;
case '*':
return num1*num2;
}
return -1;
}
private boolean isOperation(char charAt) {
return charAt == '+' || charAt == '-' || charAt == '*';
}
}
递归+memoization——使用map
// 将解通过 map 存储,其中,key 存储函数入口参数的字符串,value 存储当前全部解的一个 List
class Solution {
HashMap<String, List<Integer>> map = new HashMap<