type
status
date
slug
summary
tags
category
icon
password
一些常用的算法整体总结
一些常用的算法整体总结

数组:

1.二分查找

  • [left,right]
  • [left,right)
  • 边界[left,right]

2.双指针(移除元素)

数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖

3.滑动窗口(调节子序列的起始和终止位置)

用队列模拟或者直接用数值模拟
 

4.循环不变量写多重循环

 
 
 

链表:

notion image
notion image

1.虚拟头节点(删除节点)

2.双指针

(删除链表的倒数第N个节点)
(环形链表)

3.双向链表+哈希表(LRU)

 

哈希表:来快速判断元素是否出现在集合里(众数)

两个key映射到一个value上就叫哈希碰撞(拉链法,线性探测法)

字符串:可以反转整体再反转局部


二叉树:

最大深度和最小深度(都可以用层序遍历来做)
无法自身判定是否符合条件的时候,多考虑父子关系:
难题:
1.二叉树的最近公共祖先(从上往下考虑,遇见符合的return)
2.删除二叉树的节点(考虑删除的节点子情况)

贪心:

在考虑两个区间值的时候,要用双指针
跳跃游戏2

动态规划:

1.不同路径2:需要考虑到初始化障碍之后都不能前进
2.不同的二叉搜索树:从头节点看左右节点,即是Dp[1]=dp[0]*dp[0]

01背包问题:

模板:dp[j]代表背包j所能包含物品i最大的价值
遍历:先物品后背包,且背包遍历时从后至前的,不然前面的物品会多次使用
dp[j]=max(dp[j],dp[j-weight[i]+value[i]])//普通公式
dp[j]=max(dp[j],dp[j-nums[i]+nums[i])//计算无价值
dp[i]+=dp[j-nums[i]];//计算有几种方法,dp[0]=1(背包)

完全背包问题:

1.排列问题:先背包后物品,所有物品都需要遍历一次
2.组合问题:先物品后背包,不需要重复遍历
题目:单词拆分,确定dp[j],在确定(i-j),最后得知dp[i]是true
 
 
 
 
相关文章
八股梳理QT云盘
Camellia
Camellia
明天会更好吗?🍚
公告
type
status
date
slug
summary
tags
category
icon
password
这里是一个个人博客
用于记录和分享生活