LeetCode刷题
文章平均质量分 53
对LeetCode上的题进行总结
我的Coder小屋
本科阶段:延安大学(2015-2019),摸鱼四年。
研究生阶段:西北大学(2019-2022),还未结束,主编程语言Java
展开
-
动态规划算法
动态规划算法总结1 基本思想 动态规划问题就是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。2 解题步骤确定状态和保存状态变量(状态表示)归纳状态转移方程(状态计算)边界初始化3 例子(来自LeetCode714. 买卖股票的最佳时机含手续费) 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股原创 2021-07-12 09:06:44 · 69 阅读 · 0 评论 -
位运算的巧妙应用
位运算的巧妙应用 把一个整数减去1之后再和原来的整数做位于运算,得到的结果相当于把整数的二进制表示中的最右边的1变成0.很多二进制问题都可以用这种思路解决。常见操作:数x与x-1相与会消掉x最低位的1(x&(x-1))相同的数异或后为0,且0与任何数异或为该数(2^2 = 0; 0^12 = 12)1<<n相当于2^n判断mask从i到n每一位是否为1:(mask & (1 << i)) != 0// 判断某个数二进制表示有多少个1,数x与x-1原创 2021-07-07 08:29:41 · 116 阅读 · 0 评论 -
LeetCode中每日一题28. 实现 strStr()的趣谈
1 题目描述实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。2 题目分析这道题的暴力解法是逐个进行匹配查找是否是子串,看了一下题解中用到的是KMP优化的,具体的过程可学习官方题解,这里讲一下indexOf函数。因为这道题可以用一行代码return haystack.indexOf(needle)实现,于是好奇点进去源码里面看了一下,发现源原创 2021-04-20 11:21:28 · 64 阅读 · 0 评论 -
链表问题心得
链表问题心得 在链表的问题中当我们用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。可以让其中一个指针遍历的速度 快一些(比如一次在链表上走两步),或者先让它在链表上走若干步 ——以上引自于《剑指Offer》1 例子1.1 链表中倒数第k个节点题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点原创 2021-03-25 20:48:21 · 141 阅读 · 0 评论 -
匹配括号
题目描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’?的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。代码:暴力:class Solution { public boolean isValid(String s) { // 定义一个栈 Stack<Character> st = new Stack<Characte原创 2020-12-21 11:06:06 · 146 阅读 · 0 评论 -
柠檬水找零
860. 柠檬水找零1 题目描述2 题目分析 本题考查简单的逻辑推理能力,首先整理一下问题:一杯柠檬水5元,顾客只可能付面值5、10、20的钱,那么我们就分别考虑一下这三种情况:顾客付5元:不用找零,直接收下顾客付10元:需要找零5元顾客付20元:需要找零15元,这时候就有两种方案:优先考虑找10+5这种组合的零钱其次考虑5+5+5这种组合从以上分析情况我们需要知道收益里面额为5和10的个数,然后对每位顾客付的钱分别进行相应操作即可,具体逻辑看代码。3 代码class原创 2020-12-21 11:03:55 · 425 阅读 · 0 评论 -
两数之和
1. 两数之和1 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]2 题目分析两种思路:暴力枚举(略)使用哈希表(即牺牲空间换时间)思路:创建一个原创 2020-12-21 11:01:28 · 68 阅读 · 0 评论 -
加一
66. 加一1 题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123。2 题目分析 需要考虑两种情况长度会变:只有全9时长度才会变长度不会变:从后往前遍历数组即可3 代码如下:class Solution { public原创 2020-12-21 11:00:16 · 96 阅读 · 0 评论 -
单词规律
290. 单词规律1 题目描述 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例:输入: pattern = "abba", str = "dog cat cat dog"输出: true输入:pattern = "abba", str = "dog cat cat fish"输出: false输入: pattern原创 2020-12-21 10:56:17 · 133 阅读 · 0 评论 -
二叉搜索树的后序遍历序列(Java实现)
二叉搜索树的后序遍历序列序二叉搜索树的定义一、题目描述二、解题思路序二叉搜索树的定义二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:若其左子树存在,则其左子树中每个节点的值都不大于该节点值; 若其右子树存在,则其右子树中每个节点的值都不小于该节点值。一、题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二、解题思路...原创 2020-07-29 16:13:57 · 428 阅读 · 0 评论 -
从上往下打印二叉树(Java实现)
从上往下打印二叉树一、题目描述二、解题思路三、代码一、题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。二、解题思路二叉树的层次遍历三、代码import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right =原创 2020-07-14 17:01:33 · 278 阅读 · 0 评论 -
栈的压入、弹出序列(Java实现)
栈的压入、弹出序列一、题目描述二、解题思路图解三、代码一、题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二、解题思路1:定义一个辅助栈,再定义i,j分别指向pushA和popA序列的首元素。2:如果pushA[i]!=popA[j],i原创 2020-07-14 15:26:38 · 349 阅读 · 0 评论 -
包含min函数的栈(java实现)
包含min函数的栈一、题目描述二、问题分析代码:总结一、题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。二、问题分析刚看到这个题的时候不太懂这道题的目的是什么,定义栈的数据结构,拿Java来说,utils包下不是有Stack栈的定义吗?再一看是要实现找到栈中最小元素的min函数。这下清楚了,原来是对栈数据结构的改进,自然而然想到只需要定义一个min(原创 2020-07-02 20:20:15 · 404 阅读 · 0 评论 -
合并两个排序的链表(Java实现)
合并两个排序的链表题目描述解析思路代码附录题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解析思路首先读题想到的就是非递归思想:定义两个指针p,q分别指向这个两个链表的第一个元素,然后初始化一个mergelist空链表;接下来只需循环比较p和q指向元素的数据大小即可(两个指针都非空的情况)。最后要考虑的情况是循环结束后,p和q都有可能有一个没有遍历结束,因此还要加上一个判断条件将剩余元素附加到合并后的链表。还有一个思路就是利用递归的思想,具体看代原创 2020-06-20 07:30:12 · 1147 阅读 · 0 评论 -
字符流中第一个不重复的字符(Java实现)
字符流中第一个不重复的字符问题描述:输出描述:解题思路:代码:测试类进行测试:结果:相关知识点:问题描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。解题思路:首先对题目进行分析,第一:输入的是字符流,那么就代表字符是一个一个往里输入的,由字符流是一个一个的输入很容易根据原创 2020-06-07 15:21:29 · 652 阅读 · 2 评论 -
表示数值的字符串(Java实现)
表示数值的字符串问题描述:解题思路:代码:问题描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。解题思路:有两种思路:第一种是利用正则表达式来进行判断是否为数值,另一个方法也是剑指offer里面给出的答案,首先看第二种方法:我们首先观察字符串是数字和不是数字的区别。很显然,数字只可能包含0-9,小数点原创 2020-06-02 15:58:48 · 359 阅读 · 0 评论 -
数组中重复的数字(Java实现)
数组中重复的数字题目描述解题思路代码其他思路题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路首先,先来解读一下题目:长度为n,数字范围0到n-1且存在未知个数...原创 2020-04-30 10:38:42 · 1042 阅读 · 0 评论 -
二叉树的深度
二叉树的深度(Java)题目描述解题思路代码总结题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路对于上边的二叉树求深度:可以看出深度是3,那么怎样用算法求呢?分析:二叉树的深度是其左右子树深度较大的一方加1 。那么我们就可以采用递归的思想 解决该题。代码/**public class Tree...原创 2020-04-28 21:33:14 · 196 阅读 · 0 评论 -
用两个栈实现队列
用两个栈实现队列题目描述思路分析代码题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路分析这道题考察的是队列和栈的区别的应用。那么首先就要搞清楚队列和栈的区别。队列:先进先出栈:先进后出很容易想到用两个栈可以实现队列的进队和出队操作,实现进队: 我们用两个栈(栈1和栈2)来完成,栈1的作用就是进行入队,进队就只需要将要进入的元素入栈1即可...原创 2020-04-23 19:03:44 · 118 阅读 · 0 评论 -
二叉树的镜像
二叉树的镜像题目描述输入描述解题思路题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述解题思路本题可以采用先序遍历来解决。代码很简单,回顾下先序遍历的流程吧。...原创 2020-04-23 15:58:26 · 106 阅读 · 0 评论 -
变态跳台阶
变态跳台阶题目描述解题思路题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路思路一:规模从小到大列举,记台阶数为n,记跳法共有f(n)种:f(0) = 1n = 1时,总共有f(1) = 1种跳法n = 2时,总共有f(2) = f(1) + f(0)n = 3时,总共有f(3) = f(2) + f(1)...原创 2020-04-19 10:30:22 · 152 阅读 · 0 评论 -
不用加减乘除做加法
不用加减乘除做加法题目描述解题思路代码结论题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号解题思路本题考查的是二进制运算,不用加减乘除那么就要用二进制的位运算解决问题。首先分析十进制的相加运算:考虑2位数的正整数相加流程:1. 个位先相加得到一个结果;2. 十位数相加再的一个结果;3. 将个位数的结果和十位数的结果左移一位后二者相加就是最终答案。这样问...原创 2020-04-18 10:03:26 · 222 阅读 · 0 评论 -
构建乘积数组
构建乘积数组问题描述解题思路代码总结问题描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)解题思路首先,根据问题描...原创 2020-04-15 08:26:32 · 105 阅读 · 0 评论 -
循环打印矩阵(算法)
题目:给定一个矩阵matrix,从第一个元素开始循环打印矩阵,例如:打印结果为:1,5,6,8,3,8,3,7,6,1,6,6,2,7,2,8。算法思想:循环打印矩阵可以分而治之,即先打印最外围的一圈,依次往里推则可解决该问题。打印最外围方法如下:定义一个动点P(curR,curC),初始时curR=row1,curC=col1,①curC递增(终止条件为curC=col2),②curR递...原创 2019-05-02 18:30:45 · 2115 阅读 · 0 评论 -
按“之”字形顺序打印矩阵(算法)
题目:给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,例如:打印结果为:4,5,6,1,6,6,9,3,7。要求额外空间复杂度为O(1)。算法思想:打印“之”字形数字算法思想:根据上例容易观察出之字形可以拆分成打印上图直线上的数字,只需将打印方向改变就可以满足题目要求。设置两个初始点A和B,同时让点A向右移动,点B向下移动,当A移动到右边界时再继续向下移动,当B移动到下边界时...原创 2019-05-02 16:41:01 · 697 阅读 · 0 评论 -
经典算法(桶排序实现):一个无序数组,排序后返回相邻两数的最大差值
题目:给定一个long类型无序数组,排序后求出相邻两个数的最大差值,并返回。(要求 时间复杂度为O(n))解析:题中给出的是long类型的数组,因此数字有可能非常大,排除基数排序方法,容易看出这道题目不能用一般的排序方法。实现方法如下: 首先求出数组中元素的个数n、最小值min、最大值max;根据数据的个数建立桶: 设置桶的个数为n+1,将min~max范围的数平分为n+1等分依次作为这...原创 2019-04-11 19:03:41 · 1046 阅读 · 0 评论