leetcode练习
文章平均质量分 53
leetcode刷题
ajwlforever
这个作者很懒,什么都没留下…
展开
-
664. 奇怪的打印机(动态规划)
664. 奇怪的打印机(动态规划)有台奇怪的打印机有以下两个特殊要求:打印机每次只能打印由 同一个字符 组成的序列。每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。给你一个字符串 s ,你的任务是计算这个打印机打印它需要的最少打印次数。示例 1:输入:s = "aaabbb"输出:2解释:首先打印 "aaa" 然后打印 "bbb"。示例 2:输入:s = "aba"输出:2解释:首先打印 "aaa" 然后在第二个位置打印 "b" 覆盖掉原来的字符 'a'。原创 2021-05-24 10:47:37 · 181 阅读 · 0 评论 -
872. 叶子相似的树(递归、迭代、中序)
872. 叶子相似的树请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。示例 1:解法一、递归深度优先搜索的顺序就是本题叶值序列的顺序class Solution { List<In原创 2021-05-10 16:39:40 · 167 阅读 · 0 评论 -
制作 m 束花所需的最少天数(二分)
1482. 制作 m 束花所需的最少天数给你一个整数数组 bloomDay,以及两个整数 m 和 k 。现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。示例一:输入:bloomDay = [1,10,3,10,2], m = 3, k = 1输出:3解释:让我们一起观察这三天的花开过程原创 2021-05-10 16:16:54 · 201 阅读 · 0 评论 -
21. 合并两个有序链表(简单迭代、递归)
21. 合并两个有序链表(简单迭代、递归)将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解法一:遍历(简单迭代)用一个哨兵,遍历l1,l2比较大小,小的接到哨兵后。l1 l2的剩余接到哨兵后。class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null) return l2; if(l2原创 2021-05-06 10:46:41 · 63 阅读 · 0 评论 -
20. 有效的括号(栈)
20. 有效的括号(栈)给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。解法:遍历整个字符串,遇到左括号先入栈,遇到右括号则退栈匹配,此时若栈空或不匹配则返回false。遍历完成后栈空则返回true。class Solution { public boolean isValid(String s) { if(s.length()==1) r原创 2021-05-06 10:09:19 · 53 阅读 · 0 评论 -
198. 打家劫舍(动态规划)
198. 打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。解法:动态规划1.定义子问题, 偷n个房间,每个房间都可以选择与不偷(有时不能偷,可以强行理解为选择不偷)那么就有f[k][0]表示不偷第k个时的最大金额,f[k][1]表示偷第k个时的最大金原创 2021-05-06 09:09:50 · 56 阅读 · 0 评论 -
27.移除元素(双指针)
27.移除元素(双指针)给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:方法一:通用解法设定一个待插入位置j,另一个位置遍历原创 2021-05-06 09:05:52 · 119 阅读 · 0 评论 -
19.. 删除链表的倒数第 N 个结点(快慢指针、栈、递归)
19. 删除链表的倒数第 N 个结点(快慢指针、栈、递归)给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。**进阶:**你能尝试使用一趟扫描实现吗?解法一、计算链表长度先对链表遍历一遍计算出长度,再遍历到第L-n个结点,这个节点的下一个结点删除就ok了。class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNod原创 2021-05-06 09:04:50 · 237 阅读 · 1 评论 -
1720. 解码异或后的数组
1720. 解码异或后的数组**未知** 整数数组 arr 由 n 个非负整数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。请解码返回原数组 arr 。可以证明答案存在并且是唯一的。解:由异或运算 a^b原创 2021-05-06 09:00:12 · 55 阅读 · 0 评论 -
15. 三数之和(排序+双指针)
题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。思路首先想到的就是遍历,三重遍历暴力求解不太靠谱,时间复杂度是O(n3n^3n3).很暴力。两数之和双指针的做法:在一个有序数列,若找两数之和为0,用序列中最大(最左边)和最小(最右边)相加,小于0需要增大两数,左指针右移增大,大于0则需要减小两数,右指针左移减小,遇到等于0记录下来就好了。原创 2021-04-28 22:48:40 · 115 阅读 · 0 评论 -
173. 二叉搜索树迭代器(中序遍历的递归法与迭代法)
173. 二叉搜索树迭代器(中序遍历的递归法与迭代法)实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。in原创 2021-03-28 10:42:08 · 242 阅读 · 0 评论 -
删除排序链表中的重复元素(递归与非递归)
82.删除排序链表中的重复元素(递归与非递归)存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。解法一、非递归遍历class Solution { public ListNode deleteDuplicates(ListNode head) { ListNode p = head,h = new ListNode(0),ht = h; //虚拟头节点原创 2021-03-27 13:09:12 · 247 阅读 · 0 评论 -
旋转链表(闭合成环,快慢指针)
61. 旋转链表给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。解法一、2圈遍历(先成环,再断开) /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(in原创 2021-03-27 10:49:45 · 127 阅读 · 0 评论 -
长整数(位运算,循环移位)
题目输入一个无符号长整数,将最高字节与最低字节互换,然后输出。将这个长整数中间两个字节循环左移n位(n要输入),然后再输出。将长整数按照二进制输出,每8位输出一个空格。第一部分 最高字节与最低字节互换一.位运算& 与 两者都为1,结果才为1;(1).清零 a&0=0(2).判断某一位是否为1 10000111 & 10000000= 10000000 ; 00000111 & 10000000 = 0(3).取一个数字的指定位 a&原创 2021-03-22 22:52:20 · 841 阅读 · 0 评论 -
191.位1的个数(位运算)
位1的个数(位运算)编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。位运算& 与 两者都为1,结果才为1;(1).清零 a&0=0(2).判断某一位是否为1 10000111 & 10000000= 10000000 ; 00000111 & 10000000 = 0(3).取一个数字的指定位 a&0000 1111,取a都后四位 (2)(3)一个意思(4).原创 2021-03-22 12:26:35 · 191 阅读 · 0 评论 -
至少有K个重复字符的最长子串(分治,递归,滑动窗口)
至少有K个重复字符的最长子串(分治,递归,滑动窗口) 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。解法一、分治从题目中找出华点 首先,要找的子串是一个连续的子串 其次,该子串中的每一字符出现次数都不少于 k 那么,串中的所有不满足次数的字符一定不在所求区间内, 所以,区间就可以被这样的字符一个个分开。 最后,问题区间,被一次次分解,这,就是分治递归.class Solution原创 2021-03-22 12:15:01 · 535 阅读 · 0 评论 -
反转链表(非递归,哨兵,递归)
92. 反转链表 II给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。反转链表非递归解法 反转cur.nextcur.next = pre ;pre = cur;cur = nextnext = cur.next;新建一个头结点,头插法(哨兵法)head.next = cur;cur = cur.next;return原创 2021-03-18 15:06:20 · 128 阅读 · 0 评论 -
54. 螺旋矩阵(模拟,边界问题)
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。解法转圈遍历,模拟转圈;1.模拟转圈思路:如题目中的图一样转圈,先从1-3,再6-9,再8-7 再4 再5;当一个步骤之后,遍历结束时, 这个步骤后判断越界 来结束遍历;public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new ArrayList<Integer&原创 2021-03-15 10:44:13 · 93 阅读 · 0 评论 -
设计哈希集合(HashSet)(HashMap,BitMap)
705.设计哈希集合(HashSet)不使用任何内建的哈希表库设计一个哈希集合(HashSet)。实现 MyHashSet 类:void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。提示:0 <= key <=KaTeX parse error: Expected 'EOF', got '&a原创 2021-03-13 14:36:05 · 720 阅读 · 0 评论 -
基本计算器Ⅰ+Ⅱ
224.基本计算器题目给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。示例 1:输入:s = "1 + 1"输出:2示例 2:输入:s = " 2-1 + 2 "输出:3示例 3:输入:s = "(1+(4+5+2)-3)+(6+8)"输出:23提示:1 <= s.length <= 3 * 105s 由数字、'+'、'-'、'('、')'、和 ' ' 组成s 表示一个有效的表达式解:看到计算器,就想到了栈。首先本题原创 2021-03-12 22:57:14 · 93 阅读 · 0 评论 -
331. 验证二叉树的前序序列化(栈计数模拟,树的性质)
题目解法:1.栈模拟(1).前序遍历(NLR)前序遍历就是 首先访问根结点然后遍历左子树,最后遍历右子树。对于字符串s判断其是否为先序遍历的二叉树,可以模拟先序遍历,可以按规则将字符串全部遍历返回true;左结点遍历到底,遍历右结点需要栈来辅助,退栈到这个结点的父结点在遍历右结点。由于这个题是判断,所以没必要入栈具体的结点,只需要计数来确保有父结点可以退就ok。ps:计数栈初始值:因为当退回到根节点,退栈到0 但右结点还可以遍历,所以要设置为1;(2).代码//初值设置为1c原创 2021-03-12 14:34:59 · 74 阅读 · 0 评论 -
所有子字符串美丽值之和
题目一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。比方说,“abaacc” 的美丽值为 3 - 1 = 2 。给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和1 <= s.length <= 500s 只包含小写英文字母。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-beauty-of-all-substrings解:1.力扣第47场周赛第三题,想了很久用动态原创 2021-03-09 20:24:02 · 385 阅读 · 0 评论 -
判断一个数字是否可以表示成三的幂的和
题目给你一个整数 n ,如果你可以将 n 表示成若干个不同的三的幂之和,请你返回 true ,否则请返回 false 。对于一个整数 y ,如果存在整数 x 满足 y == 3x ,我们称这个整数 y 是三的幂。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/check-if-number-is-a-sum-of-powers-of-three解1.从最大的3的幂开始,如果大于等于剩余数字,就应当使用这一幂次(因为剩下的所有幂次加起来也比它小原创 2021-03-09 18:41:09 · 1019 阅读 · 0 评论 -
删除字符串中的所有相邻重复项 (动态规划,栈,数组模拟)
题目给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string解解法一、动态规划f[i]表示i这个字符是否被删除,1代表已删除,初始化全部为0;f(i)={1,0)f(i)原创 2021-03-09 17:06:05 · 101 阅读 · 0 评论 -
分割回文串(回溯法,动态规划预处理)
题目给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。思路:1.要对字符串进行分割,并判断每个子串是否为回文串。 假设ab,aba 这样切割ab不是回文串后面就没有讨论的必要了。所以深度优先回溯法刚好。2.每次都要判断是否回文串,因为dfs会重复判断,所以用动态规划预处理f[i][j]为表示序列i到j是回文串。class Solution { private List<List<String>> res; int[原创 2021-03-07 13:56:11 · 228 阅读 · 0 评论 -
503. 下一个更大元素 II (单调栈)
题目给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/next-greater-element-iiclass Solution { public int[] nextGreaterElements原创 2021-03-06 21:28:30 · 55 阅读 · 0 评论 -
俄罗斯套娃信封问题(排序+动态规划)(二分+贪心)
题目给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。解法原创 2021-03-04 15:01:17 · 519 阅读 · 1 评论 -
3. 无重复字符的最长子串(滑动窗口+贪心)
题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。解法1. 滑动窗口+贪心。思路:1.right < s.length(); right++;2.当窗口内未出现重复字符的时候, right-left+1就是目前最长子串的长度。2.当窗口内出现重复字符的时候, left++(与1在一次循环中) ,整个窗口后移。若重复字符一直存在在窗口内,那么为了保持right-left+1就是目前最长子串的长度,继续整个窗口后移。ps:整个过程就是一个right < s.len原创 2021-03-03 21:28:26 · 143 阅读 · 1 评论 -
338. 比特位计数 (找规律,数学法,位运算详解)
题目给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。解法遍历一遍每一个数都计算其中1的数量,时间复杂度为O(n*sizeof(interger);11111 —> 100000 , 11110 -> 11111 ,数字在增大时,无非就是这两种情况,1的数量要么+1,要么减少,其中1的数量和之前的已经统计数有密切的关系,用动态规划,将这个数变小为x,统计变小的那一位y是否有1 res[x]+y。第原创 2021-03-03 09:37:15 · 598 阅读 · 0 评论 -
304. 二维区域和检索 - 矩阵不可变
题目给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable解法:利用前缀和前缀和: 前缀和是一个数组的某项下标之前(原创 2021-03-02 13:37:42 · 67 阅读 · 0 评论 -
2. 两数相加
题目给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-two-numbers算法思路模拟1.链表是数字的倒序,链表的开始是数的最低位.2.从最低位开始做加法,设置一个进位标志位,将本位计算结果放置到l1原创 2021-03-02 13:13:26 · 56 阅读 · 0 评论 -
303. 区域和检索 - 数组不可变
题目给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。实现 NumArray 类:NumArray(int[] nums) 使用数组 nums 初始化对象int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], … , nums[j]))来源:力扣(LeetCode)链接:https://lee原创 2021-03-01 10:49:12 · 65 阅读 · 0 评论 -
剑指 Offer 56 - I. 数组中数字出现的次数(位运算总结)
题目一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。leetcode示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]解题思路题目要求找到只出现一次的两个数字,并规定了时间复杂度是O(n),空间复杂度是O(1);这么快,显然只能用数学的方法解决。一.位运算& 与 两者都为1,结果才为1;(1).清零 a&0=0(2).判断某一位是否为原创 2021-02-28 16:14:16 · 130 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
剑指 Offer 12. 矩阵中的路径题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字原创 2021-01-23 17:52:33 · 64 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder =[3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-sh...原创 2021-01-20 18:03:22 · 56 阅读 · 0 评论