leeteCode刷题技巧


本文持续更新,希望和大家共同进步,欢迎探讨
我们在进leeteCode进行刷题时不要盲目的去刷,而是有技巧有意识的去判断自己所做的题目属于哪一种类别,同时牢记不同类别的出题方式

如:题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。

诸如此类的操做,接下来我开始带着大家进入算法的乐园
首先看看我们的题目大概分为哪几类

注意:本文的通用类,如ListNode的定义均在common包中
点击此处查找

常用知识点

int []nums={2,1,5,3,7,9,0}
int max=Arrays.stream(nums).max().getAsInt();//数组获取最大值
List<Integer> list=//数组转list

1.二分查找

做题思路:

利用逼近的方法逐渐靠近我们需要的结果,首先设置高低位,通过与mid即中间值的对比来进行相应的操作

题目类型:

一般对有序的数组进行操作时可以先考虑使用二分查找法

题目实例:

第一阶段
题目编号题目名称题目链接代码链接
704二分查找https://leetcode-cn.com/problems/binary-search/点击查看
278第一个错误版本https://leetcode-cn.com/problems/first-bad-version/点击查看
35搜索插入位置https://leetcode-cn.com/problems/search-insert-position/点击查看

第二阶段
题目编号题目名称题目链接代码链接题目详解
34在排序数组中查找元素的第一个和最后一个位置https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/点击查看暂无解析
33搜索旋转排序数组https://leetcode-cn.com/problems/search-in-rotated-sorted-array/点击查看暂无解析
74搜索二维矩阵https://leetcode-cn.com/problems/search-a-2d-matrix/点击查看暂无解析
153寻找旋转排序数组中的最小值https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/点击查看点击查看
162寻找峰值https://leetcode-cn.com/problems/find-peak-element/点击查看暂无解析

2.排序问题

2.1 双指针法

做题思路:

i指向起始位置,j指向终止位置。
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
如果A[i]*A[i]<A[j]*A[j]那么result[k–] = A[j] * A[j];
如果A[i] * A[i] >= A[j] * A[j] 那么result[k–] = A[i] * A[i];
总而言之一句话:务必保证K指向的位置存的都是较大的一个数
如图所示:

题目类型:

数组有序的,而且最大或最小值在数组两端。

题目实例:

题目编号题目名称题目链接代码链接
189轮转数组https://leetcode-cn.com/problems/rotate-array/点击查看
977有序数组的平方https://leetcode-cn.com/problems/squares-of-a-sorted-array/点击查看
283移动0https://leetcode-cn.com/problems/move-zeroes/点击查看
167两数之和 II - 输入有序数组https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/点击查看
344反转字符串https://leetcode-cn.com/problems/reverse-string/点击查看
557反转字符串中的单词 IIIhttps://leetcode-cn.com/problems/reverse-words-in-a-string-iii/点击查看
876链表的中间结点https://leetcode-cn.com/problems/middle-of-the-linked-list/点击查看
19删除链表第N个结点https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/点击查看

第二阶段
题目编号题目名称题目链接代码链接题目详解
82删除排序链表中的重复元素2https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/点击查看暂无解析
15三数之和https://leetcode-cn.com/problems/3sum/点击查看暂无解析
844比较含退格的字符串https://leetcode-cn.com/problems/backspace-string-compare/点击查看暂无解析
11盛最多水的容器https://leetcode-cn.com/problems/container-with-most-water/点击查看暂无解析
986区间列表的交集https://leetcode-cn.com/problems/interval-list-intersections/点击查看暂无解析

3.数组

做题思路:

此类题目我们一般采用哈希表或相邻元素比较等方式来实现

题目实例:

题目编号题目名称题目链接代码链接
217存在重复元素https://leetcode-cn.com/problems/contains-duplicate/点击查看
1两数之和https://leetcode-cn.com/problems/two-sum/点击查看
88合并两个有序数组https://leetcode-cn.com/problems/merge-sorted-array/点击查看

4.动态规划

做题思路:

动态规划的思想通过解决了一个一个简单的问题,进而把简单的问题的解组成了复杂的问题的解

题目实例:

第一阶段
题目编号题目名称题目链接代码链接题目详解
53最大子数组和https://leetcode-cn.com/problems/maximum-subarray/点击查看点击查看
77爬楼梯https://leetcode-cn.com/problems/climbing-stairs/点击查看点击查看
198打家劫舍https://leetcode-cn.com/problems/house-robber/点击查看点击查看
120三角形最小路径和https://leetcode-cn.com/problems/triangle/点击查看暂无解析

5.滑动窗口

做题思路:

什么是滑动窗口?
就是将元素一个又一个的放入队列中,其中队列就是我们所说的窗口,如无重复字符的最长子串中abcabcbb的最长子串:

  • 当abc依次进入队列之后,此时的最大值max=3
  • a又进入了一次,此时我们就会向后滑动一格,即从b最为起始点计算最长无重复的子串,即bca,max=3
  • 当b进入之后继续向后滑动一格变为cab,计算无重复子序列值为3(即max=3)
  • c进入之后,同理,继续向后滑动一格,变为abc,计算无重复子序列值为3(即max=3)
  • b再次进入之后,队列继续向后滑动两格变为cb,注意此处滑动了两格,原因就是需要将已经出现的元素滑动出去,原本队列里是abc,此时只有连续滑动两个才能将b滑动出队列,此时的最大子序列长度变为2,max继续保留原有的最大值3,(注意:只有遇到更大的值才需要更换max的值,因为我们求得就是最长无重复子序列)
  • b在次进入,我们同样需要滑动两格将b滑动出去,此时队列变为b,这种情况下的最长序列变为1,max仍保留原值3
    至此滑动窗口的全部过程就结束了

题目实例:

题目编号题目名称题目链接代码链接题目详解
3无重复字符的最长子串https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/点击查看解析参考解题思路的过程
567字符串的排列https://leetcode-cn.com/problems/permutation-in-string/点击查看在代码的注释中
第二阶段
题目编号题目名称题目链接代码链接题目详解
438找到字符串中所有字母异位词https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/点击查看解析参考解题思路的过程
713乘积小于K的子数组https://leetcode-cn.com/problems/subarray-product-less-than-k/点击查看在代码的注释中
209长度最小的子数组https://leetcode-cn.com/problems/minimum-size-subarray-sum/点击查看在代码的注释中

6.广度优先搜索 / 深度优先搜索

做题思路:

广度优先搜索(BFS)

广度优先遍历的本质就是层次遍历,使用BFS可以求解非带权图的单源最短路径问题,这是由于 BFS总是按照距离由近到远来遍历图中的每一个顶点的性质决定的,下面 我们具体以一个实际的图进行操作。

具体广度优先遍历的流程如下:

  • a入队,a出队,此时a的后继结点bc入队:队列元素为:bc,结果:a
  • b出队,b的后继结点d,e入队:队列元素为:cde,结果:ab
  • c出队,c的后继结点f,g入队:队列元素为:defg,结果:abc
  • d出队,d无后继结点:队列元素为:efg,结果:abcd
  • e出队,e的后继结点h入队:队列元素为:fgh,结果:abcde
  • f出队,f无后继节点:队列元素为:gh,结果:abcdef
  • g出队,g无后继节点:队列元素为:h,结果:abcdefg
  • h出队,h无后继节点:队列元素为:空,结果:abcdefgh,由于队列为空,遍历结束

BFS 使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。BFS 总共有两个模板:

  • 1.如果不需要确定当前遍历到了哪一层,BFS 模板如下。
while queue 不空:
    cur = queue.pop()
    for 节点 in cur的所有相邻节点:
        if 该节点有效且未访问过:
            queue.push(该节点)
  • 2.如果要确定当前遍历到了哪一层,BFS 模板如下。
    这里增加了 level 表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size 表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。
level = 0
while queue 不空:
    size = queue.size()
    while (size -->0) {
        cur = queue.pop()
        for 节点 in cur的所有相邻节点:
            if 该节点有效且未被访问过:
                queue.push(该节点)
    }
    level ++;

深度优先搜索(DFS)

深度优先搜索类似于树的先序遍历,同样,我们具体以一个实际的图进行操作。

具体广度优先遍历的流程如下:

  • a出,a有后继节点b,b出,b有后继结点d,d出:abd
  • d无后继结点,回退到b,b有后继结点d,e但d已经访问过了,e出:abde,e有后继结点h,h出:abdeh
  • h无后继结点,回退e,e有后继结点h,但h已经 访问继续回退,回退到b,b的后继结点也全部被访问,继续回退,回退到a,访问后继结点c:abdehc
  • c有后继结点f,访问f:abdehcf
  • f无后继结点,回退到c,访问另一个 后继结点g:abdehcfg
  • 结点全部访问,遍历结束

题目实例:

题目编号题目名称题目链接代码链接题目详解
733图像渲染https://leetcode-cn.com/problems/flood-fill/点击查看点击查看
617合并二叉树https://leetcode-cn.com/problems/merge-two-binary-trees/点击查看请参考代码注释解析
116填充每个节点的下一个右侧节点指针https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/点击查看请参考代码注释解析
733图像渲染https://leetcode-cn.com/problems/flood-fill/点击查看请参考代码注释解析
5420 1矩阵https://leetcode-cn.com/problems/01-matrix/点击查看点击查看
994腐烂的橘子https://leetcode-cn.com/problems/rotting-oranges/点击查看请参考01矩阵的解题思路
第二阶段
题目编号题目名称题目链接代码链接题目详解
200岛屿数量https://leetcode-cn.com/problems/number-of-islands/点击查看暂无解析
574省份数量https://leetcode-cn.com/problems/flood-fill/点击查看点击查看
1091二进制矩阵中的最短路径https://leetcode-cn.com/problems/shortest-path-in-binary-matrix/点击查看暂无解析
572另一棵树的子树https://leetcode-cn.com/problems/subtree-of-another-tree/点击查看暂无解析
797所有可能的路径https://leetcode-cn.com/problems/all-paths-from-source-to-target/点击查看暂无解析
130被围绕的区域https://leetcode-cn.com/problems/surrounded-regions/点击查看暂无解析

7.递归/回溯

题目编号题目名称题目链接代码链接题目详解
206反转链表https://leetcode-cn.com/problems/reverse-linked-list/点击查看暂无解析
21合并两个有序链表https://leetcode-cn.com/problems/merge-two-sorted-lists/点击查看暂无解析
77组合https://leetcode-cn.com/problems/combinations/点击查看暂无解析
46全排列https://leetcode-cn.com/problems/permutations/点击查看请务必牢记该题的解决方式,理解不了就把代码背下来,以后遇到类似的题目即可套用,同时应牢记DFS的进退栈思想
784字母大小写全排列https://leetcode-cn.com/problems/letter-case-permutation/点击查看参考代码解析

7.位运算

在位运算的操作者,我们需要 熟知的几个操作:

  • 1.如果(n&(n-1))==0表示n是2的幂次方
  • 2.a<<n:表示 a左移n位,相当于
    a ∗ 2 n a*2^n a2n
  • 3.a>>n:表示a右移n位,相当于
    a ÷ 2 n a÷2^n a÷2n
  • 4.>>= 右移赋值
  • 5.>>>= 右移赋值,左边空出的位以0填充
  • 6.a⊕0=a
  • 7.a⊕a=0
  • 8.a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
题目编号题目名称题目链接代码链接题目详解
2312的幂https://leetcode-cn.com/problems/power-of-two/点击查看暂无解析
191位1的个数https://leetcode-cn.com/problems/number-of-1-bits/点击查看暂无解析
136只出现一次的数字https://leetcode-cn.com/problems/single-number/点击查看暂无解析
190颠倒二进制位https://leetcode-cn.com/problems/reverse-bits/点击查看暂无解析
  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZNineSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值