Leetcode hot100 补刷部分 Ⅲ

目录

二分法

2024.6.6

35 搜索插入位置

74 搜索二维矩阵

2024.6.11

34 在排序数组中查找元素的第一个和最后一个位置

 33 搜索旋转排序数组

 2024.6.12

153 寻找旋转排序数组中的最小值

20 有效的括号

2024.6.13

155 最小栈

 394 字符串解码

2024.6.14 

739 每日温度

215 数组中的第k个最大元素

2024.6.16

347 前k个高频元素

贪心算法

2024.6.17

121 买卖股票的最佳时机

55 跳跃游戏

2024.6.18

45 跳跃游戏 Ⅱ

 763 划分字母区间

动态规划

2024.6.19

70 爬楼梯

118 杨辉三角

2024.6.20

198 打家劫舍

​编辑

01背包

2024.6.21

完全背包

322 零钱兑换

279 完全平方数

2024.6.22

139 单词拆分

300 最长递增子序列

2024.6.25

152 乘积最大子数组

2024.6.26

416 分割等和子集

多维动态规划

2024.6.27

62 不同路径

2024.6.28

64 最小路径和

2024.7.6

5 最长回文子串

2024.7.9

1143 最长公共子序列

2024.7.11

72 编辑距离

技巧

2024.7.12

136 只出现一次的数字

169 多数元素

2024.7.13

75 颜色分类

 31 下一个排列

287 寻找重复数


二分法

2024.6.6


35 搜索插入位置

目标是找到第一个大于等于target位置的下标

74 搜索二维矩阵

先对矩阵的第一列的元素二分查找,找到最后一个不大于target的元素,然后在该元素所在行中二分查找target是否存在。

2024.6.11


34 在排序数组中查找元素的第一个和最后一个位置

两者的判断条件不同,为了代码的复用,我们定义 binarySearch(nums, target, lower) 表示在 nums 数组中二分查找 target 的位置,如果 lower 为 true,则查找第一个大于等于 target 的下标,否则查找第一个大于 target 的下标。

 33 搜索旋转排序数组

虽然不是有序的数组,但是是部分有序的,还是可以使用二分法,不仅要判断mid和target的值大小,还要看两个区间是不是有序的

 2024.6.12


153 寻找旋转排序数组中的最小值

20 有效的括号

有效字符串中 括号是匹配的

2024.6.13


155 最小栈

使用辅助栈,每次一个元素进栈就将当前栈内的最小值加入辅助栈,元素出栈对应的最小元素也弹出。

 394 字符串解码
  • 本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。

1. 构建辅助栈 stack, 遍历字符串 s 中每个字符 c;

  • 当 c 为数字时,将数字字符转化为数字 m,用于后续倍数计算;
  • 当 c 为字母时,在 res 尾部添加 c;
  • 当 c 为 [ 时,将当前 m和 res 入栈,并分别置空置 0:

        记录此 [ 前的临时结果 res 至栈,用于发现对应 ] 后的拼接操作;
        记录此 [ 前的倍数 multi 至栈,用于发现对应 ] 后,获取 m× [...] 字符串。
        进入到新 [ 后,res 和 multi 重新记录。

  • 当 c 为 ] 时,stack 出栈,拼接字符串 res = last_res + cur_m * res,其中:

        last_res是上个 [ 到当前 [ 的字符串,例如 "3[a2[c]]" 中的 a;
        cur_m是当前 [ 到 ] 内字符串的重复倍数,例如 "3[a2[c]]" 中的 2。

2. 返回字符串 res。

2024.6.14 


739 每日温度

可以换成peek,pop,push;Deque双端队列模拟栈

215 数组中的第k个最大元素

升序排序以后,目标元素的下标是 N−k,这里 N 是输入数组的长度。

优先级队列,解决top K问题

最小堆:根节点最小;     最大堆:根节点最大

找到K个最大的元素,维护一个有 K 个元素的最小堆,堆顶根节点就是我们要找的元素;其时间复杂度为 O(nlogk),因此堆排序这种解法在数据规模 n 较大,维护规模 k 较小时优化会比较明显

基于快速排序的选择方法 可以达到 O(n) 的时间复杂度

2024.6.16


347 前k个高频元素

思路:首先使用哈希表统计每个元素出现的次数;根据出现次数创建一个最小堆的优先级队列(里面存储键值对);依次遍历哈希表中的键值对,不断对最小堆进行更新;最后将最小堆键值对中的键存到一个数组中输出。

创建了一个优先级队列(PriorityQueue),并为其提供了一个自定义的比较器(Comparator)来定义队列中元素的优先级

PriorityQueue<int[]> queue=new PriorityQueue<int[]>(new Comparator<int[]>() {

            public int compare(int[] m,int[] n){

                return m[1]-n[1];   //根据出现的次数设置优先级,小的优先级高,即设置了一个最小堆;返回负数,第一个元素在前面;返回正数,第一个元素在第二个元素后面

            }

});

在Java中,Map.Entry<Integer, Integer> 是一个泛型类,用于表示映射(Map)中的一个键值对。当你有一个 Map<Integer, Integer> 类型的对象时,每个键值对都可以通过 Map.Entry <Integer, Integer> 来表示。

Map.Entry 提供了获取键(key)和值(value)的方法:

  • getKey(): 返回与此条目相对应的键。
  • getValue(): 返回与此条目相对应的值。
  • setValue(V value): 用指定的值替换与此条目相对应的值,并返回旧值。

贪心算法

贪心算法一般分为如下四步:              通过局部最优,达到全局最优

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

2024.6.17


121 买卖股票的最佳时机

找到所有天中股票价格最低的时候,然后用当前天的价格减去最低价格与最大值比较,更新最大值

:最低价格初始设置Integer.MAX_VALUE,遍历中每次先更新最低值,如果这次是最低就更新,并继续下次遍历;如果不是最低,就计算赚的钱与最大值的大小(这里计算的保证了买入在卖出的前面,并且买入的价格低)

55 跳跃游戏

因为元素代表的是可以跳跃的最大长度,不去纠结具体跳几步,而是看覆盖范围,只要覆盖 那这里面的元素位置一定可以到达

对于第一个元素确定的最大覆盖范围cover,之后要在这个范围内遍历元素,并且更新cover所维护的最大范围;如果覆盖范围大于等于最后位置的下标,就是true;遍历完之后还是小于最后的位置,则false

2024.6.18


45 跳跃游戏 Ⅱ

到达最后一个位置的最小跳跃次数

每一步尽可能地增加覆盖范围,当覆盖到最后一个位置时,就是最小的步数

统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖(如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。)

 763 划分字母区间

记录每个字母出现的最远位置

当前遍历的位置等于区间最右侧值(之前遍历过的每个字母出现位置的最大值)时,这个区间就结束,加入list中

动态规划

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

2024.6.19


70 爬楼梯

1阶 1种;2阶 2种;第3阶就是由1阶上两个台阶或者2阶上一个台阶,就是1阶和2阶的方法和

118 杨辉三角

2024.6.20


198 打家劫舍

这个房间能不能偷,取决于前面的房间, 考虑到这个房间就会有两种可能,偷或不偷;两个状态下取最大的金额


01背包

n种物品,每种物品只有一个

二维数组:dp[i][j]表示0-i的物品任取放到容量为j(重量)的背包中的最大价值;不放物品i,为dp[i-1][j];放物品i,dp[i-1][j-weight[i]]+vaue[i];根据这个来确定初始化,i,j有0的应该被初始化(第一行第一列),其他非0的初始化为几都没事;遍历两个for循环,先物品或者先背包容量都可以

一维数组:dp[j]表示容量为j的背包中的最大价值;相当于直接将上层拷贝,不放物品i,就是dp[j];放物品i,就是dp[j-weight[i]]+value[i] ;  dp[0]=0,因为会覆盖,所以初始化为0;

for循环顺序不能换,先物品后背包(并且背包中倒序,这样物品i只被放入一次)

2024.6.21


完全背包

每个物品可以使用无数次;背包遍历正序;对于纯完全背包问题,两个for循环顺序可以颠倒

先物品后背包 一般是求组合

先背包后物品 一般是求排列

322 零钱兑换

279 完全平方数

2024.6.22


139 单词拆分

可以用动态规划的思想看

300 最长递增子序列

2024.6.25


152 乘积最大子数组

运行通过,但是有一个测试用例溢出

2024.6.26


416 分割等和子集

先考虑不满足的条件,再定义dp数组含义,考虑边界条件进行初始化,进行遍历

多维动态规划

2024.6.27


62 不同路径

2024.6.28


64 最小路径和

2024.7.6


5 最长回文子串

只有 s[i+1:j−1] 是回文串,并且 s 的第 i 和 j 个字母相同时,s[i:j] 才会是回文串

可以写出动态规划的边界条件:

P(i,i)=true

P(i,i+1)=(Si​==Si+1​)​

注意:在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。

2024.7.9


1143 最长公共子序列

子序列可以不连续,都在两个序列中即可

2024.7.11


72 编辑距离

dp[i][j] 表示以下标i-1为结尾的字符串word1(长度为i的字符串),和以下标j-1为结尾的字符串word2(长度为j的字符串),最近编辑距离为dp[i][j]

技巧

2024.7.12


136 只出现一次的数字

设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间

位运算:相同为0,不同为1

169 多数元素

  • 时间复杂度 O(N) : N 为数组 nums 长度。
  • 空间复杂度 O(1) : votes 变量使用常数大小的额外空间。

2024.7.13


75 颜色分类

使用双指针一次遍历进行交换

 31 下一个排列

              

[i+1,nums.length)内的元素升序排序 很重要!!!   不然下一个排列会出错

287 寻找重复数

快慢指针,找环入口


除了6道困难题没刷,还有一个题剩一个测试用例没过,其余hot100题已完成。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值