leetcode刷题
梁山话事人
这个作者很懒,什么都没留下…
展开
-
面试题xuexixiexue
dddd原创 2022-07-14 16:18:52 · 391 阅读 · 1 评论 -
哈希集合和哈希映射的简单设计
设计哈希集合不使用任何内建的哈希表库设计一个哈希集合(HashSet)。实现 MyHashSet 类:void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。示例:输入:[“MyHashSet”, “add”, “add”, “contains”, “contains”, “add”, “contain.原创 2021-11-09 15:19:21 · 501 阅读 · 0 评论 -
leetcode2021.11.03
剑指 Offer II 091. 粉刷房子难度中等假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。原创 2021-11-03 15:07:19 · 586 阅读 · 0 评论 -
Leetcode2021.11.2
Leetcode2021.11.2105. 岛屿的最大面积难度中等585给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0。package offer;public class offer105{原创 2021-11-02 20:17:35 · 141 阅读 · 0 评论 -
55. 跳跃游戏
跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。public boolean canJump(int[] nums) { int rightmost=0;//rightmost是用于记录当前所能到.原创 2021-10-15 11:06:49 · 865 阅读 · 0 评论 -
300. 最长递增子序列
最长递增子序列给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4import org.junit.Test.原创 2021-10-15 09:18:58 · 87 阅读 · 0 评论 -
134. 加油站
加油站在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例 1:输入:gas = [1,2,3,4,5]cost = [3,4,5,1,2].原创 2021-10-06 09:30:57 · 90 阅读 · 0 评论 -
139. 单词拆分
单词拆分给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。动态规划:维护布尔性数组dp[n+1],dp[i]=true,表示s(0.原创 2021-10-05 16:29:04 · 78 阅读 · 0 评论 -
岛屿类问题题解
岛屿的最大面积给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。示例 1:public int maxAreaOfIsland(int[][] grid) { int res=0;.原创 2021-10-04 19:56:53 · 235 阅读 · 0 评论 -
138. 复制带随机指针的链表
复制带随机指针的链表给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --&.原创 2021-10-04 11:04:52 · 81 阅读 · 0 评论 -
347. 前 K 个高频元素
前 K 个高频元素给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]public int[] topKFrequent(int[] nums, int k) { HashMap<Integer,Integer>map=new HashMap&l.原创 2021-10-04 09:56:17 · 82 阅读 · 0 评论 -
2021-10-03
比较版本号给你两个版本号 version1 和 version2 ,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和.原创 2021-10-03 21:18:46 · 285 阅读 · 0 评论 -
2021-10-03
另一棵树的子树给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。/** * Definition for a binary tree node. * public class TreeNode { * int val; * Tree.原创 2021-10-03 21:15:47 · 76 阅读 · 0 评论 -
1143. 最长公共子序列
最长公共子序列难度中等707收藏给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 =.原创 2021-10-03 18:59:07 · 82 阅读 · 0 评论 -
64. 最小路径和
最小路径和给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。动态规划:需要知道动态规划方程初始值:dp[0][0]=grid[0][0]i=0 dp[0][j]=dp[0][j-1]+grid[0][j];j=0 dp[i][0]=dp[i-1].原创 2021-10-03 15:30:08 · 100 阅读 · 0 评论 -
112. 路径总和
路径总和给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。 public boolean hasPathSum1(TreeNode root, int targetSum) { return dfs(root,0,targetSum); } public boolean dfs(TreeNode r.原创 2021-10-03 14:56:46 · 64 阅读 · 0 评论 -
463. 岛屿的周长
岛屿的周长给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。示例 1:输入:grid = .原创 2021-10-01 21:32:50 · 63 阅读 · 0 评论 -
290. 单词规律
单词规律给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = “abba”, str = “dog cat cat dog”输出: true示例 2:输入:pattern = “abba”, str = “dog cat cat fish”输出: false示例 3:输入: pattern =.原创 2021-09-27 15:34:57 · 73 阅读 · 0 评论 -
1047. 删除字符串中的所有相邻重复项
删除字符串中的所有相邻重复项难度简单给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字.原创 2021-09-27 11:39:24 · 65 阅读 · 0 评论 -
46 47全排列
全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]public List<List<Integer>> permute(int[] nu.原创 2021-09-27 10:48:50 · 69 阅读 · 0 评论 -
78. 子集
子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]List<List<Integer>>ans=new ArrayList<List<Integer>&.原创 2021-09-27 10:07:14 · 63 阅读 · 0 评论 -
199. 二叉树的右视图
二叉树的右视图给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例 1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例 2:输入: [1,null,3]输出: [1,3]二叉树的层序遍历 public List<Integer> rightSideView(TreeNode root) { List<Integer>ans=new ArrayList<>.原创 2021-09-27 09:39:04 · 67 阅读 · 0 评论 -
229. 求众数 II
求众数 II给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。示例 1:输入:[3,2,3]输出:[3]示例 2:输入:nums = [1]输出:[1]示例 3:输入:[1,1,1,3,3,2,2,2]输出:[1,2]//方法一:哈希表计数 public List<Integer> majorityElement(int[] nums) { .原创 2021-09-27 09:09:26 · 63 阅读 · 0 评论 -
77. 组合-----回溯
组合给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1:输入:n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]示例 2:输入:n = 1, k = 1输出:[[1]]List<List<Integer>>ans=new ArrayList<List<Integer>>(); List<.原创 2021-09-26 20:24:06 · 58 阅读 · 0 评论 -
116. 填充每个节点的下一个右侧节点指针
填充每个节点的下一个右侧节点指针给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。 public Node connect(Node root) { .原创 2021-09-26 14:32:33 · 50 阅读 · 0 评论 -
148. 排序链表
排序链表给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?示例 1:输入:head = [4,2,1,3]输出:[1,2,3,4]开始的想法是使用一个数组存储所有的节点,然后用冒泡排序排序其中的数字之后,输出链表头。结果运行的结果正确,但是时间超出限制。/** * Definition for singly-linked list. * public class Lis.原创 2021-09-26 11:05:08 · 83 阅读 · 0 评论 -
hashmap遍历
class Solution { public int singleNumber(int[] nums) { HashMap<Integer,Integer>map=new HashMap<Integer,Integer>(); for(int i=0;i<nums.length;i++) { map.put(nums[i],map.getOrDefault(nums[i],0)+1); .原创 2021-09-26 10:06:21 · 80 阅读 · 0 评论 -
剑指 Offer II 038. 每日温度
剑指 Offer II 038. 每日温度请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例 1:输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]示例 2:输入: temperatures = [30,40,50,60]输出: [1,1,1,0]暴力解法 publ原创 2021-09-24 10:50:59 · 63 阅读 · 0 评论 -
剑指 Offer II 026. 重排链表
剑指 Offer II 026. 重排链表给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln-1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入: head = [1,2,3,4]输出: [1,4,2,3]借助数组,可以实现链表的随机读取,从而可以任意操作链表 public void reorderList(Lis原创 2021-09-24 09:37:09 · 65 阅读 · 0 评论 -
剑指 Offer II 025. 链表中的两数相加
剑指 Offer II 025. 链表中的两数相加给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。可以假设除了数字 0 之外,这两个数字都不会以零开头。示例1:输入:l1 = [7,2,4,3], l2 = [5,6,4]输出:[7,8,0,7]示例2:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[8,0,7]示例3:输入:l1 = [0], l2 = [0]输出:[0]原创 2021-09-24 09:04:46 · 68 阅读 · 0 评论 -
剑指 Offer II 014. 字符串中的变位词
剑指 Offer II 014. 字符串中的变位词给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。换句话说,第一个字符串的排列之一是第二个字符串的 子串 。示例 1:输入: s1 = “ab” s2 = “eidbaooo”输出: True解释: s2 包含 s1 的排列之一 (“ba”).示例 2:输入: s1= “ab” s2 = “eidboaoo”输出: False提示:1 <= s1.length, s2.length <=原创 2021-09-23 16:31:46 · 101 阅读 · 0 评论 -
剑指 Offer II 010. 和为 k 的子数组
剑指 Offer II 010. 和为 k 的子数组给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2解释: 此题 [1,1] 与 [1,1] 为两种不同的情况示例 2 :输入:nums = [1,2,3], k = 3输出: 2class Solution { public int subarraySum(int[] nums, int k) { Map<Integ原创 2021-09-23 10:56:29 · 83 阅读 · 0 评论 -
剑指 Offer II 009. 乘积小于 K 的子数组
剑指 Offer II 009. 乘积小于 K 的子数组给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。示例 1:输入: nums = [10,5,2,6], k = 100输出: 8解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。需要注意的是 [10,5,2] 并不是乘积小于100的子数组。示例 2:输入: nums = [1,2,3], k原创 2021-09-23 09:27:00 · 93 阅读 · 0 评论 -
剑指 Offer II 008. 和大于等于 target 的最短子数组
剑指 Offer II 008. 和大于等于 target 的最短子数组给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:targ原创 2021-09-23 08:46:07 · 62 阅读 · 0 评论 -
剑指 Offer II 007. 数组中和为 0 的三个数
剑指 Offer II 007. 数组中和为 0 的三个数给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]class Solution { public Li原创 2021-09-22 21:38:01 · 67 阅读 · 0 评论 -
剑指 Offer II 006. 排序数组中两个数字之和
剑指 Offer II 006. 排序数组中两个数字之和给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。示例 1:输入:numb原创 2021-09-22 21:08:40 · 65 阅读 · 0 评论 -
剑指 Offer II 002. 二进制加法
剑指 Offer II 002. 二进制加法给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1 和 0。示例 1:输入: a = “11”, b = “10”输出: “101”示例 2:输入: a = “1010”, b = “1011”输出: “10101”class Solution { public String addBinary(String a, String b) { StringBuilde原创 2021-09-22 19:37:28 · 92 阅读 · 0 评论 -
129. 求根节点到叶节点数字之和
求根节点到叶节点数字之和给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。叶节点 是指没有子节点的节点。示例 1:输入:root = [1,2,3]输出:25解释:从根到叶子节点路径 1->2 代表数字 12从根到叶子节点路径 1->3 代表数字 13因此,数字总.原创 2021-09-22 19:13:17 · 76 阅读 · 0 评论 -
113.路径总和 II
路径总和 II给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:[[5,4,11,2],[5,8,4,5]]示例 2:输入:root = [1,2,3], targetSum = 5输出:[]示例 3:输入:root = [1,2], targ.原创 2021-09-22 16:04:46 · 126 阅读 · 0 评论 -
leetcode18. 四数之和
四数之和给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :0 <= a, b, c, d < na、b、c 和 d 互不相同nums[a] + nums[b] + nums[c] + nums[d] == target你可以按 任意顺序 返回答案 。示例 1:输入:nums = [1,0,-1,0,-2,2], target = .原创 2021-09-22 14:31:27 · 62 阅读 · 0 评论