算法入门,纪录篇

二分查找

首先二分查找,通常来说就可以想象成一个二叉树,所以对于二分查找遍历来说,其算法时间复杂度是log(n),因此在考查查找算法时要求时间复杂度是log(n)的时候。二分查找过程中,通常我们会定义一个left,right指针,来分别指向第一个和最后一个元素。用mid来表示他们中间值。在二分查找中经常涉及到的问题就是:

  1. while循环中判断符号是否要加上等号
  2. mid是否要加一
  3. if判断中的终止条件
    由于本文是建立在python的基础上,所以此处在介绍一下py小白所遇到的问题:

python中对于整除法
mid = (low + high) // 2 注意使用的是两个/


python中浮点数除法:
mid = (low + high) / 2 只有一个/表示的事浮点数除法

双指针

双指针在我看来可以分为两类,其中包括了快慢指针
左右指针。前者主要解决链表中的问题,后者主要解决数组和字符串中的问题。

1. 快慢指针

通常定义一个low与fast指针,low指针通常一次前进一步,fast通常走两步,这样可以很方便的判断链表中是否存在环。通常如果是一个数组,经过几轮循环可能也会回到原来的数,那么此题也可以尝试用快慢指针去完成。

2. 左右指针

左右指针通常用的相对较多的就是二分查找

滑动窗口

滑动窗口从字面理解为:

滑动:说明这个窗口是移动的,通常在一维数组或者字符串中从前往后滑动或者从后往前滑动
窗口:窗口简单来说就是一个长度变化的容器,他可以根据题目要求来变化窗口的大小,所以通常查找字符串中最大长子串等一系列问题

窗口通常也可以定义left和right指针分别指向窗口的开始位置和结束位置。

广度深度搜索

广度和深度搜索问题通常作用于树图问题,深度优先搜索通常伴随着递归的出现,广度优先搜索通常就是用到队列,
常见的算法就是BFS,DFS。

递归

递归通常来说遇到重复的做一件事情的时候我们通常可以想到递归,尤其是类似深度遍历那种。但是递归所占用内存空间较大,所以通常谨慎使用,一般来说能用递归实现的题目,也可以用栈去实现。

动态规划

动态规划就是创建一个状态容器dp,然后用来记录子问题的状态,从而父问题可以从子问题容器中获取而进行下一步的计算,也就是说通常考虑到子问题的话我们就要想到动态规划,动态规划也是算法中较难的部分,求出状态关系式很重要。

位运算

位运算常涉及:
1. n & (n-1)表示的是删除最后一位1
2. 异或运算 ⊕。异或运算有以下三个性质:

任何数和 00 做异或运算,结果仍然是原来的数,即 a⊕0=a。
任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值