LeetCode 分类练习-task03查找

一.查找表

考虑的基本数据结构

  • 第一类: 查找有无–set
    元素’a’是否存在,通常用set:集合
  • 第二类: 查找对应关系(键值对应)–dict
    元素’a’出现了几次:dict–>字典
  • 第三类: 改变映射关系–map
    通过将原有序列的关系映射统一表示为其他

二. 对撞指针

遍历时多用索引,而不要直接用值进行遍历

三. 滑动数组

e.x.
固定滑动数组的长度为K+1,当这个滑动数组内如果能找到两个元素的值相等,就可以保证两个元素的索引的差是小于等于k的。如果当前的滑动数组中没有元素相同,就右移滑动数组的右边界r,同时将左边界l右移。查看r++的元素是否在l右移过后的数组里,如果不在就将其添加数组,在的话返回true表示两元素相等。

四、二分查找

class Solution:
    def firstBadVersion(self, arr):
        # 第一点
        lo, hi = 0, len(arr)-1
        while lo < hi:
            # 第二点
            mid = (lo+hi) // 2
            # 第三点
            if f(x):
                lo = mid + 1
            else:
                hi = mid
        return lo
  • 第一点:lo和hi分别对应搜索的上界和下界,但不一定为0和arr最后一个元素的下标。

  • 第二点:因为Python没有溢出,int型不够了会自动改成long int型,所以无需担心。如果再苛求一点,可以把这一行改成

mid = lo + (hi-lo) // 2
# 之所以 //2 这部分不用位运算 >> 1 是因为会自动优化,效率不会提升
  • 第三点: 比较重要的就是这个f(x),在带入模板的情况下,写对函数就完了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值