LeetCode历程 By UnflyBrenda

目录

一、链表

(1)链表逆序、翻转链表(easy&&medium)

(2)链表求交点(easy)

(3)链表求环(medium)

(4)链表划分(medium)

(5)复杂链表的复制(深度拷贝)(hard)

(6)排序链表的合并(easy&&hard)

二、栈,队列,堆

(1)使用队列实现栈&&使用栈实现队列(easy&&easy)

(2)包含min函数的栈(easy)

(3)简单的计算器(hard)

(4)数组中第K大的数(easy)

(5)找到数据流中的中位数

三、贪心算法

(1)分配饼干(easy)

(2)摇摆序列(medium)

(3)移除K个数字(medium)

(4) 跳跃游戏(medium&&hard)

(5) 射击气球最小射击手数目(medium)

四、递归、回溯与分治

(1)求子集(medium) 回溯

(2)组合数之和(medium) 回溯

(3)生成括号(medium) 递归

(4)N皇后(hard),回溯

(5)逆序数(hard) 分治,归并

五、二叉树与图

(1)路径之和(m)

  (2) 最近的公共祖先节点(m)

  (3)二叉树转链表(m)

  (4)侧面观察二叉树(宽搜)(m)

  (5)课程安排(有向图判断) (m)

六、二分查找与二叉查找树 

 (1)插入位置(e)

(2) 区间查找(m)

(3)旋转数组查找 (m)

(4)二叉树的编码和解码 (m)

(5)逆序数(h) 

七、哈希表与字符串

(1)最长回文串(e 字符哈希)

(2)词语模式(e 字符串哈希)

(3)同字符词语分组(m)

(4)无重复字符的最长子串(m)

(5)重复的DNA序列(m)

(6)最小窗口子串(h)

八、动态规划

(1)爬楼梯(e)

(2)打家劫舍(e)

(3)最大子段和(e)

(4)找零钱

(5)三角形

(6)最长上升子序列

(7)最小路径和

(8)地牢游戏

九、搜索

(1)岛屿数量(深搜)

(2)词语阶梯

(3)词语阶梯2

(4)火柴棍摆正方形

(5)收集雨水


一、链表

(1)链表逆序、翻转链表(easy&&medium)

全部逆序206&&从m到n位置的逆序92

(2)链表求交点(easy)

相交链表160

概念:两个单链表十分相交(有环无环)

(3)链表求环(medium)

是否有环141&&入环节点142

(4)链表划分(medium)

86(类似于荷兰国旗问题)

(5)复杂链表的复制(深度拷贝)(hard)

copy list with random pointer138

(6)排序链表的合并(easy&&hard)

合并2个有序链表21&&合并k个有序链表23

二、栈,队列,堆

(1)使用队列实现栈&&使用栈实现队列(easy&&easy)

232(两个栈实现一个队列)&&225(两个队列实现一个栈)

(2)包含min函数的栈(easy)

Min Stack 155:得到任意时刻栈中的最小值(申请两个栈,一个数据,一个当前最小值,同步进出栈)

(3)简单的计算器(hard)

224只能进行加法减法(switch case判断是数字、加减符号、左右括号)

略复杂,不好想,但是代码简单。要注意加减符号决定正负(一个flag标识),还有字符是否为数字Character.isDigit(c),还有字符串转换为数字cur = 10*cur + s.charAt(++i) - '0';

(4)数组中第K大的数(easy)

215:使用优先级队列维护一个k大小的小根堆

首先优先级队列,在java里面默认的是小根堆。(如果需要大根堆,需要自己写一个compare函数)

小根堆,堆顶是K个数的最小值,也就是数组中第K大的数,把数组的数不断放进队列中,数目大于k的时候,把堆顶弹出。

(5)找到数据流中的中位数

295使用两个堆

一个大根堆和一个小根堆,大根堆里面的数都小于小根堆里面的数。中位数就在两个堆顶中间产生。

三、贪心算法

(1)分配饼干(easy)

孩子需求数组和提供饼干数组分别排序455

(2)摇摆序列(medium)

376 Wiggle Subsequence

摇摆序列最长子序列的长度:最高和最底部的时候length++

(3)移除K个数字(medium)

402Remove K Digits

就是说给一个字符串形式的正数,删除k个数字,使得字符串数字最小

(4) 跳跃游戏(medium&&hard)

55&&45 Jump Game

55:能不能调到最后的位置,需要维护的是当前能够跳的最远的地方

56:last_maxIndex其实是上一步能够到达的最远距离,cur_maxIndex是当前能够到达的最远距离

(5) 射击气球最小射击手数目(medium)

452 Minimum Number of Arrows to Burst Balloons

活动选择问题,会议室选择问题开展最多会议数目,其实一一个类型

将所有的气球按照终止位置排序,开始从前向后扫描。以第一个气球的终止位置为准,只要出现的气球起始位置小于这个气球的终止位置,代表可以一箭使这些气球全部爆炸;当出现一个气球的起始位置大于第一个气球的终止位置时再以这个气球的终止位置为准,找出所有可以再一箭爆炸的所有气球;以此类推

四、递归、回溯与分治

(1)求子集(medium) 回溯

             78 Subsets(java) ;80 Subsets II

(2)组合数之和(medium) 回溯

             39 combination sum ;40 Combination Sum II;216 Combination Sum III;377 Combination Sum IV

(3)生成括号(medium) 递归

             生成括号

(4)N皇后(hard),回溯

             N皇后

(5)逆序数(hard) 分治,归并

             逆序数

五、二叉树与图

(1)路径之和(m)

路径之和(113)

  (2) 最近的公共祖先节点(m)

最近的公共祖先节点

  (3)二叉树转链表(m)

二叉树转链表114

  (4)侧面观察二叉树(宽搜)(m)

侧面观察二叉树199

  (5)课程安排(有向图判断) (m)

课程安排207

六、二分查找与二叉查找树 

 (1)插入位置(e)

         35:给定一个排序数组和一个目标值,如果能够找到这个值,就返回值的坐标,如果找不到,就返回值的插入位置的坐标值

(2) 区间查找(m)

        34,查找当前数在数组的区间范围

(3)旋转数组查找 (m)

      33:数组可能以某一下标旋转,也就是不是完全的升序 

(4)二叉树的编码和解码 (m)

    499:使用占位符进行二叉树的序列化和反序列化 

(5)逆序数(h) 

   315:使用二叉搜索树和归并排序,统计当前数右侧有多少数比它小

七、哈希表与字符串

(1)最长回文串(e 字符哈希)

409:使用字符串中的字符,任意组合,注意奇数偶数问题

(2)词语模式(e 字符串哈希)

290:就变成了了判断是否一一对应的关系 遍历pattern的字符,如果存在于map中,要判断value值是否equals当前的str中对应的单词 如果字符不存在于map中,在加入map前要先判断当前单词作为value值是否存在于map中(这点十分重要)

(3)同字符词语分组(m)

49:数组哈希,有两种实现的方法,一个是,对数组的每一个字符串元素排序,排序后结果一样的分为一组,也就是说key是排序后的字符串,比如"aet" 第二种方法是统计每个字符串中的每个字符出现的个数,分为同一组的字符串每个字符出现的次数是相同的,也就是key应该记录26个字母(小写)每一个字母出现的个数

(4)无重复字符的最长子串(m)

3:最长子串,而不是最长子序列。子串是字符串连续的一段,子序列是可以不连续的 所以有一种方法叫做滑动窗口法,我记得左程云老师讲过,那个题是计算窗口内最大或者最小值的

(5)重复的DNA序列(m)

187:可以枚举,将长度为10的子串存入hashmap中,这样其实这个题就是个easy的题

(6)最小窗口子串(h)

76:就是在S中找出包括T的所有字符的最小窗口 ,要求时间复杂度是O(N) 所以有了之前滑动窗口的概念,这个题会好理解一点

 

八、动态规划

(1)爬楼梯(e)

每次走1层或者两层,求n层有集中走法

(2)打家劫舍(e)

相邻两家不能抢劫,求抢劫的最大财富

(3)最大子段和(e)

以i为结尾的子段,最大和的dp问题

(4)找零钱

给定target,找出数组中零钱使用最小张数组成target

(5)三角形

从上往下,只能向下一行相邻的两个地方走,也就是数组对齐后的正下方和右下方,求到达最后一行的最小步长

(6)最长上升子序列

一个数组中,上升子序列的最大长度(非连续,没排序),

(7)最小路径和

一个矩形,从左上到右下的最小路径

(8)地牢游戏

王子在左上,公主在右下,救公主的过程中可能会掉血,也可能会增加生命值,要求在过程中至少一滴血,问骑士开始营救之前至少多少血

九、搜索

(1)岛屿数量(深搜)

1为土地,0是水域,1连成一片则是岛屿,求岛屿数量

(2)词语阶梯

就是给一个单词词典,给一个开始词汇和结束词汇,在词典中找出开始词汇转变成结束词汇的过程,求转变次数 每次只能转变单词的一个字符

(3)词语阶梯2

跟上一题127一样,但是额外要求要输出搜索的路径,而且是 所有的路径 所以需要考虑将路径转换为有向图,然后将有向图中的最短路径全部枚举出来

(4)火柴棍摆正方形

就是在N个数里面找出四组数,使得每一组的和都是相等的 优化很容易想到,就是先总和除以4取余,不为0说明不能成正方形,因为不能折断 然后从大到小排序,每一次判断当前值和平均值的关系 大于,就不能拼成正方形,直接false;等于,一条边完成摆放,进行下一条边;小于,记录这个火柴,继续搜,看有没有火柴长度和它加起来能够到达平均值,没有就false --------------------- 作者:unflyBrenda 来源:CSDN 原文:https://blog.csdn.net/yysave/article/details/92803991 版权声明:本文为博主原创文章,转载请附上博文链接!

(5)收集雨水

二维数组存储的是每个单元的高度,求最多接多少体积的雨水 首先想到的就是找到最低点。然后用了广度优先搜索,还有优先级队列的重排序 

你可能感兴趣的:(leetcode,算法,leetcode刷题总结)