LeetCode刷题小感悟

最近在因面试的需要在LeetCode刷了几天题,记录一下刷题的一些小感悟,方便继续补充和回顾。

一、常用的数据结构

vector、list、stack、queue、map

  • 通过下标定位、是线性结构(无限、有序、离散)
  • 每个下标只能存储一个单位的数据
  • 常用的STL方法:
    1. 排序 sort(vec.begin()+i, vec.end());
    2. 二分查找 binary_search(vec.begin(), vec.end(), s);二分查找要求数组必须是有序数组。

tree

  • 对于n中选择的结构,可以用来表示n中选择条件,也可用来存储2^n的中间数据。

  • 使用树作为数据结构的算法可能是不稳定的。

network、digraph、undigraph

  • 图是可以使用nxn的矩阵表示
  • 图也可以使用vector实现矩阵

二、算法的基础概念

  • 算法空间:算法空间就是处理一个算法所需要的变量或空间,可以使用变量、线性表、矩阵、图等方式存储。

  • 局部解:对于算法,最容易获取到的就是一个局部的解,一般一个解包含以下属性:

    1. 问题域:此临时解所涉及到的数据
    2. 参数:此临时解如果可以使用函数唯一的标识,那么此函的参数就是此解的参数
    3. 结果:此临时解获得的最终值
    4. 复杂度:此临时解的时间空间复杂度

    一般局部解可以使用如下两种方法表示
    f ( r e t , i , j , . . . ) r e t = f ( i , j , . . . ) f(ret, i, j, ...) \\ ret = f(i, j, ...) f(ret,i,j,...)ret=f(i,j,...)
    其中ret为函数的返回值,i,j等为函数的参数。

  • 算法的最终解:获取算法的最终解可能包含两种方法,一种是直接获取每一项的最终解,另一种是逐步优化所有的解,同步推导处所有的解。

  • 在算法中,有两种问题需要解决

    • 算法的逻辑
      1. 对于一个问题,可能会存在一个暴力解法,如果能暴力算法能够直接标示,则计算出该算法的时间复杂度。
      2. 如果时间复杂度满足要求,则不需要再考虑新的优化方案,如果理论上有更好的算法,能够减少时间复杂度,则可以再剩余的时间中考虑时间复杂度更少的方案出来。尽量避免上来就陷入复杂算法的思考中。
      3. 常用的简化算法的步骤要求如下:
        • 充分挖掘隐含条件
        • 动手寻找解的步骤
        • 跳出局部寻找解之间的关系
    • 算法的边界

三、算法结构

  • 线性结构

f o r i = 0 ; j = 0 ; . . i < n ; j < m ; . . . { a i = ′ 空 格 ′ ; i + + ; a i = ′ ∗ ′ ; b = − 1 ; { b = 0 ; b = − 1 ; b ≠ 0 ; ✓ ; a i = ′ . ′ ; i + + ; for_{i=0;j=0;..}^{i<n;j<m;...} \left\{ \begin{aligned} a_i = '空格'; i++;\\ a_i = '*'; b=-1; \left\{ \begin{aligned} b =0;b=-1;\\ b\neq0;\checkmark; \end{aligned} \right.\\ a_i = '.'; i++;\\ \end{aligned} \right. fori=0;j=0;..i<n;j<m;...ai=;i++;ai=;b=1;{b=0;b=1;b=0;;ai=.;i++;

一般在草稿纸上验算算法,可以写成如上的结构,主要有for结构和if结构,这两种结构右侧都使用大括号将语句块包含进去,if一般可以省略。

  • 递归结构

    递归是一种特殊的算法结构,一般来说,普通的循环对应的结构是线性循环结构循环,递归对应的是非线性循环结构或树状结构。

    线性循环结构公式入下,及不改变参数的函数和对应关系,将f函数运行n次

f o r i = 0 n f ( i ) for_{i=0}^{n}f(i) fori=0nf(i)

非线性循环如下,它改变了函数参数的对应关系,例如汉诺塔问题:
f o r i ↔ j f ( i , j ) for_{i \leftrightarrow j}f(i,j) forijf(i,j)
树状结构一般参数一般由计算出来n个子结点获得,逐步推导出父结点出来:

f ( G f ( i , j ) , K f ( i , j ) ) f ( i , j ) = G ( i , j ) K ( i , j ) f(Gf(i,j), Kf(i, j))\\ f(i,j) = G(i,j)K(i,j) f(Gf(i,j),Kf(i,j))f(i,j)=G(i,j)K(i,j)

递归结构的思考方法如下:

  • 从问题规模入手

    如果该问题的解和问题的规模有关,则可以尝试是否能用小规模的解+分类讨论的方法明确更大规模的解,由大及小。

  • 从改变参数含义入手

    如果问题的解和问题规模无关,尝试使用相同含义的变量实现从其他值的推导,例如结点、指针等,然后复用已经存在的过程,由小及大。

四、常见算法的使用

经典五大算法包括:分治算法、动态规划、贪心算法、回溯法、分支限界法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值