刷题算法与数据结构知识点

算法

暴力穷举

O(n^2)

双指针和滑动窗口

一般用来优化暴力穷举,时间复杂度O(n)
常用场景:快慢指针,左右指针以及滑动窗口[left,right]

滑动窗口用来解决子串最值问题

滑动窗口算法模板
最小区间
while j < len(nums):
    判断[i, j]是否满足条件
    while 满足条件:
        不断更新结果(注意在while内更新!)
        i += 1 (最大程度的压缩i,使得滑窗尽可能的小)
    j += 1

作者:HelloPGJC
链接:https://leetcode.cn/problems/fruit-into-baskets/solutions/1437444/shen-du-jie-xi-zhe-dao-ti-he-by-linzeyin-6crr/
来源:力扣(LeetCode)

最大区间
while j < len(nums):
    判断[i, j]是否满足条件
    while 不满足条件:
        i += 1 (最保守的压缩i,一旦满足条件了就退出压缩i的过程,使得滑窗尽可能的大)
    不断更新结果(注意在while外更新!)
    j += 1

作者:HelloPGJC
链接:https://leetcode.cn/problems/fruit-into-baskets/solutions/1437444/shen-du-jie-xi-zhe-dao-ti-he-by-linzeyin-6crr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


最大滑窗是在迭代右移右边界的过程中更新结果,而最小滑窗是在迭代右移左边界的过程中更新结果。

无重复字符的最长子串

桶计数

假设区间范围为[0,5] 整数
可声明6个桶 来分别计数
桶计数技巧可用来计数,统计分布

递归

有起始和终止条件,有递归关系用递归很好解
经典题目:
杨辉三角
斐波那契数列

动态规划

分治

KMP算法

时间复杂度:O(m+n)

s1="ABCDEF" //主串
S2="ABAA" //模式串 

最大公共前后缀长度表

ABAA
0011

最大公共前后缀长度表计算

失配时,模式串向右移动的位数为:已匹配字符数 - 失配字符的上一位字符所对应的最大长度值

next数组的话

next 数组的值是除当前字符外(注意不包括当前字符)的公共前后缀最长长度

等价于最大公共前后缀长度表往右移动一位,首位为-1

ABAA
-1001

KMP算法详解(写的非常通俗易懂)

数据结构

数组

存相同的数据类型,有索引

查找O(1)

插入和删除 O(n)

二维数组

int[][] array = new int[][]{{1,2,3}};
int[][] array = new int{{1,2,3}};

字符串

实质就是不可变(final)的char数组

哈希表

key-value 键值对 哈希函数

解决哈希冲突 (链地址法)

链表

队列

先进先出的结构,front 队首指针,rear 队尾下标

先进后出的结构,push,pop,peek方法

计算器

有效的括号

场景

模式串匹配

KMP

前缀和

即声明一个长度比原数组大一的preSum数组存sum[i0]+…+sum[ij] ,第一个索引值为0,二维数组则是增加一列第一列值为0

这样在计算总和时用这个preSum数组时间复杂度O(n)

1480. 一维数组的动态和

643. 子数组最大平均数 I

304. 二维区域和检索 - 矩阵不可变

字符串去重问题

位运算(这类型题目有点炫技…就不多补充了…感兴趣的可以去leetcode自行找位运算专题)

两个相同的数字进行异或操作得到0

a^a=0;

只出现一次的数字

交换两个数字 (一个数异或同一个数两次还是那个数)

int a=10;b=30;
a=a^b;
b=a^b;
a=a^b;

相同的数字进行异或操作得到0

a^a=0;

待更新…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值