数组类算法基础【总结】

1、做数组类算法问题的时候,我们常常需要定义一个变量,明确该变量的定义,并且在书写整个逻辑的时候,要不停的维护住这个变量的意义。也特别需要注意初始值和边界的问题。

  • 比如明确左右指针移动方向?从哪儿开始?步长是多少?满足什么条件后移动?边界?
  • 数组操作前是不是已经有序?有序就存在潜在的限制条件;
  • 数组是不是都是正数?如果都是正数存在潜在的限制条件:比如前i个元素相加的和肯定是有序增长的,元素个数越多,和越大;
  • 原地操作是非常重要的基础思想
    • 不增加额外空间
    • 可能数据会来回覆盖!!!一定要想明白递推公式

2、运用基础算法思想,比如二分查找,快排中的分区轴选择,堆排序中的大顶堆小顶堆,归并排序等,很多题目都是利用这些基础算法思想,做一些特殊改良。

3、对撞指针进行求解:指针 i 和 j 分别指向数组的第一个元素和最后一个元素,然后指针 i 不断向前, 指针 j 不断递减,直到 i = j(当然具体的逻辑操作根据题目的变化而变化)

4、双指针

  • 这个是非常经典的套路
  • 双指针有很多类型
    • 对撞指针,第3条已经说了
    • 双指针通向移动,从左往右,从右往左
    • 双指针从中间向两边移动
    • 双指针移动的时候起始位置非常重要
    • 双指针移动的时候移动步长,是每次一样,还是按规律变化?是每次一步还是多步?
    • 双指针移动的指针边界问题,一定不要下标超出限制

5、滑动窗口方法解题,可以将时间复杂度控制在 O(n) 级别,最重要的是定义好滑动窗口,明确它要表达的意思,当然边界和初始值非常重要

  • 滑动窗口测速度是一个经典的场景,比如用redis做一个分布式的滑动窗口测速
  • 其实TCP的有效报文确认也是一个滑动窗口
  • MySQL的 redo log 文件也算一个滑动窗口环状,不过它是首位相连更像回环链表

怎么练习算法,自己走了很多冤枉路,还是回头重来!

  • 基础算法思想一定要掌握,不然盲目的练习题目没得任何意义;
  • 学习基础算法一定要看专业的教材书,比如算法导论,大学时候的教科书,博客上写的有些不准确,很可能让你误入歧途,博客知识只是辅助你理解教科书上的难懂部分;
  • 坚持每天都练习,不然手一定会生疏,我曾经练习了2个月然后放弃,这样来回折腾2次没得啥进步,还浪费了时间;所以一旦你开启算法练习计划就要坚持每天至少写1-2个题目,让思维一直活跃!!!
  • 完事开头难,欲速则不达,循序渐进,这些道理没人不知道,但是能做到很难;很多练习算法的人一上来就做最难的题目,苦思考冥想最优解,一个题目几个小时还没进展,最后怀疑自己,然后打击自信心,最后放弃;我就经历过这种心路历程。
    • 开始只选择基础题目
    • 一个系列一个系列开始练习,比如我先练习的算法-数组基础模块
    • 练习每个题目首先是想一个能跑通的解,然后才思考最优解
    • 一个题目如果思考了10分钟,还完全没思路一定要看答案,因为完全没思路的情况下,你思考10分钟和1天本质没区别,只是浪费时间,增加心里负担;
    • 如果有部分思路,写了20分钟还没写出来,也一定要看答案,因为20分钟还没写出来,肯定是思路还不够清晰;
    • 看完答案把优秀的解答记录下来,思考一遍,实在理解不到也没关系,可以暂存,后面回头复习
  • 读题目的时候各种限制条件也看完,有的潜在限制条件需要你自己再提取,比如告诉你一个数组是递增有序就包含潜在规则i+1个元素大于i;很多题目的突破口就在潜在限制条件中;这有点像高中数学题中,最后一个大题,很多入口都在潜在限制条件中;
  • 可以用一个demo数据来思考思路,也可以用demo数据来验证思路,也可以用demo数据来验证代码;但是demo数据包含的用力不够全,demo数据跑通了不代表答案对,但是demo数据都跑不通,答案肯定错的;
  • 借助草稿纸,截屏软件画图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值