(基于Java)算法笔记——分治算法

分治算法的简单学习笔记

1、算法解释

分治算法——分与治

  • 把原问题分为子问题
  • 再把子问题进行处理合并
  • 分治问题可以通过主定理求得时间复杂度
  • 自上而下的分治结合memoization,避免重复遍历相同的子问题

主定理
在这里插入图片描述

2、表达式问题

① LeetCode 241 为运算表达式设计优先级

解题思路

  • 遍历字符串
  • 遇到操作符,就将左右两边的字符串,分别当作 两个表达式

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<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值