面试问题浓缩总结 面试问题浓缩总结
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • Go
  • Java
  • C/C++
  • JavaScript/HTML
  • MySQL
  • Redis
  • MongoDB
  • 操作系统
  • 计算机网络
  • spring全家桶
  • mybatis
  • 中间件
  • 软件相关
  • 系统相关
  • 算法
  • 数据结构
  • 设计模式
  • CMU硕士经典100题
  • 剑指offer
  • 重点手撕代码
  • 程序员面试金典
  • 3月
  • 4月
  • 智力题
  • 业务问题
  • 一些技术
  • 安全相关
APP下载 (opens new window)
GitHub (opens new window)
  • 算法

  • 数据结构

  • 设计模式

  • CMU硕士经典100题

    • 贪心算法
    • 双指针法
    • 二分查找
    • 各种排序
    • 各种搜索
    • 动态规划
    • 分治法解题
      • 解释
      • 表达式问题
        • 为运算表达式设计优先级
    • 数学问题
    • 位运算
    • 数据结构
    • 字符串
    • 链表
    • 树
    • 图
    • 更加复杂的数据结构
  • 剑指offer

  • 重点手撕代码

  • 程序员面试

  • CodeTop企业题库

  • 笔试题目

  • 算法和数据结构
  • CMU硕士经典100题
小游
2021-03-24
解释
表达式问题
为运算表达式设计优先级

分治法解题

# 解释

顾名思义,分治问题由“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子 问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就 是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为 1 的子数组;“治”即为把已经排好序的两个小数组合成为一个排好序的大数组, 从长度为 1 的子数组开始,最终合成一个大数组。

可以使用主定理来求解时间复杂度

# 表达式问题

# 为运算表达式设计优先级

image-20210325141456840

一般这种分治法都是使用递归来进行求解。题如下

func diffWaysToCompute(expression string) []int {
   var ways []int
   // 遍历整个字符串
   for i:=0;i< len(expression);i++ {
      c:=string(expression[i])
      // 首先我们判断当前的符号是否为运算符
      if c=="+" || c=="-" || c=="*" {
         // 如果是运算符的那么就分别计算左右两边的和
         // 这里实际上就已经把左右两边所有的情况都计算进去了
         left:=diffWaysToCompute(expression[:i])
         right:=diffWaysToCompute(expression[i+1:])
         // 下面我们就只需要依次组合计算
         for _,l:=range left{
            for _,r:=range right{
               // 判断运算符的类型并把结果放入我们的结果数组
               switch c {
               case "+":
                  ways = append(ways, l+r)
               case "-":
                  ways = append(ways, l-r)
               case "*":
                  ways = append(ways, l*r)
               }
            }
         }
      }
   }
   // 如果结果为空,说明只有数字,我们直接转换一下即可
   if len(ways)==0 {
      if n,err:=strconv.Atoi(expression);err==nil{
         ways=append(ways,n)
      }
   }
   return ways
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
编辑 (opens new window)
上次更新: 2021/03/25, 23:10:37
动态规划
数学问题

← 动态规划 数学问题→

Theme by Vdoing | Copyright © 2021-2025 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式