leetcode分类刷题

本文深入探讨了数据结构的基础,包括数组、链表及其操作,如二分查找、移除元素;哈希表的原理与应用;链表的三种类型及常见操作;二叉树的遍历和各类题目。此外,还涵盖了回溯算法、贪心策略、动态规划等核心算法,通过实例解析加深理解。
摘要由CSDN通过智能技术生成

1. 数组

        数组是基本的数据结构,面试中考察数组的题目一般在思维上并不复杂,主要是考查面试者对代码的掌控能力。

  1. 数组下标都是从0开始
  2. 数组在内存空间的地址是连续的

题目:

  • easy

704. 二分查找

27. 移除元素

209. 长度最小的子数组

59. 螺旋矩阵 II

2. 链表

        链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域,另一个是指针域(存放指向下一个节点的指针),链表的入口节点称为头节点(head),最后一个节点的指针域指向NULL(空指针)。

        链表的三种类型:单链表、双链表、循环链表

题目:

  • easy

203. 移除链表元素

206. 反转链表

  • midding

707. 设计链表

19. 删除链表的倒数第 N 个结点

142. 环形链表 II

3. 哈希表

        哈希表(Hash Table),散列表,根据关键码的值直接访问数据的数据结构,一般用来快速判断一个元素是否出现在集合中。

        哈希碰撞的两种解决方法:拉链法 、线性探测法

集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::set红黑树有序O(logn)O(logn)
std::multiset红黑树有序O(logn)O(logn)
std::unordered_set哈希表无序O(1)O(1)

  

题目:

  • easy

242. 有效的字母异位词

349. 两个数组的交集

1. 两数之和

  • midding

 15. 三数之和

18. 四数之和

4. 字符串

        字符串是由若干字符组成的有限序列,也可以理解为一个字符数组。

  • easy

344. 反转字符串

541. 反转字符串 II

28. 实现 strStr()

 459. 重复的子字符串

  •  midding

151. 颠倒字符串中的单词

5. 栈与队列

队列:先进先出

栈   :先进后出

题目:

  • easy

232. 用栈实现队列

225. 用队列实现栈

20. 有效的括号

  • midding

150. 逆波兰表达式求值

347. 前 K 个高频元素

  • hard

239. 滑动窗口最大值

42. 接雨水

6. 二叉树

二叉树的种类:满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树

 二叉树的遍历:深度优先 广度优先(递归:栈  队列)

递归三部曲:

(1)确定递归函数的参数和返回值

(2)确定递归终止条件

(3)确定单层递归的逻辑

题目:

144. 二叉树的前序遍历

94. 二叉树的中序遍历

145. 二叉树的后序遍历

102. 二叉树的层序遍历

226. 翻转二叉树

101. 对称二叉树

104. 二叉树的最大深度

111. 二叉树的最小深度

110. 平衡二叉树

112. 路径总和

257. 二叉树的所有路径

113. 路径总和 II

106. 从中序与后序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

98. 验证二叉搜索树

617. 合并二叉树

700. 二叉搜索树中的搜索

530. 二叉搜索树的最小绝对差

501. 二叉搜索树中的众数

236. 二叉树的最近公共祖先

235. 二叉搜索树的最近公共祖先

701. 二叉搜索树中的插入操作

450. 删除二叉搜索树中的节点

669. 修剪二叉搜索树

108. 将有序数组转换为二叉搜索树

7. 回溯算法

 (1)确定回溯函数的返回值和参数

(2)确定回溯函数的终止条件

(3)确定回溯函数的遍历过程

//回溯算法的循环:
//    1. 求排列for(int i=0; ...)
//    2. 求组合for(int i=startInd; ...)
//note: 要注意去重问题

题目:

77. 组合

216. 组合总和 III

17. 电话号码的字母组合

39. 组合总和

40. 组合总和 II

131. 分割回文串

93. 复原 IP 地址

78. 子集

491. 递增子序列

46. 全排列

47. 全排列 II

51. N 皇后

37. 解数独

8. 贪心算法

 解题步骤:
(1)将问题分解为若干子问题

(2)找出贪心策略

(3)求解每一个子问题的最优解

(4)将局部最优堆叠成全局最优

题目:

455. 分发饼干

376. 摆动序列

53. 最大子数组和

122. 买卖股票的最佳时机 II

55. 跳跃游戏

45. 跳跃游戏 II

134. 加油站

135. 分发糖果

860. 柠檬水找零

452. 用最少数量的箭引爆气球

56. 合并区间

738. 单调递增的数字

9. 动态规划

动态规划“五部曲”

(1)确定dp及下标的含义

(2)确定递推公式

(3)初始化dp

(4)确定遍历顺序

(5)举例推导dp

//0-1背包的核心代码
for(int i=0; i<weight.size(); ++i){
    //容量从大到小遍历,保证每个物品仅添加一次
    for(int j=bagWeight; j>=weight[i]; --j){
        dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
    }
}

//完全背包核心代码
for(int i=0; i<weight.size(); ++i){
    //容量从小到大遍历,保证每个物品可添加无数次
    for(int j=weight[i]; j<=bagWeight; ++j){
        dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
    }
}

//1. 求最大 dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
//2. 求组合 dp[j] += dp[j-nums[i]]
//3. 求排列 dp[j] += dp[j-nums[i]]
//求组合数,外层循环遍历物品,内层循环遍历背包
//求排列数,外层循环遍历背包,内层循环遍历物品

题目:

509. 斐波那契数

70. 爬楼梯

746. 使用最小花费爬楼梯

62. 不同路径

63. 不同路径 II

343. 整数拆分

96. 不同的二叉搜索树

416. 分割等和子集

494. 目标和

474. 一和零

518. 零钱兑换 II

377. 组合总和 Ⅳ

322. 零钱兑换

279. 完全平方数

139. 单词拆分

121. 买卖股票的最佳时机

122. 买卖股票的最佳时机 II

123. 买卖股票的最佳时机 III

188. 买卖股票的最佳时机 IV

309. 最佳买卖股票时机含冷冻期

714. 买卖股票的最佳时机含手续费

300. 最长递增子序列

674. 最长连续递增序列

718. 最长重复子数组

1143. 最长公共子序列

1035. 不相交的线

392. 判断子序列

115. 不同的子序列

583. 两个字符串的删除操作

72. 编辑距离

647. 回文子串

516. 最长回文子序列

10. 其他

  • 二分查找

33. 搜索旋转排序数组d

  • 递归

234. 回文链表

  • 并查集

剑指 Offer II 116. 省份数量

  • 拓扑排序

207. 课程表
 

  • 深度优先

236. 二叉树的最近公共祖先

543. 二叉树的直径

78. 子集

参考文献:《代码随想录lu 跟着Carlarl学算法》 孙秀洋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值