LeetCode
hequnwang10
这个作者很懒,什么都没留下…
展开
-
字节跳动提前批-Android开发一面
首先自我介绍。原创 2022-07-22 10:16:40 · 725 阅读 · 1 评论 -
106. 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。原创 2022-06-30 11:19:51 · 421 阅读 · 0 评论 -
678. 有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:示例 2:示例 3:二、解题两次遍历正反遍历,从左往右遍历,确定右括号,从右往左遍历,确定左括号。时间复杂度:O(n)空间复杂度:O(1)从左到右遍历字符串,遍历过程中,未匹配的左括号数量可能会出现如下变化:如果遇到左括号,则未匹配的左括号数量加 1;如果遇到右括号,则需要有一个左括号和右括号匹配,因此未匹配的左括号数量减 1;如果遇到星号,由于星号可以看成左括号、右括号或原创 2022-06-30 09:41:48 · 523 阅读 · 0 评论 -
442. 数组中重复的数据
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。示例 2:示例 3:二、解题一次遍历正负号判断法,出现过的数字就数字取反,然后判断是否取反过。时间复杂度:O(n)空间复杂度:O(1)。...原创 2022-06-29 20:41:22 · 179 阅读 · 0 评论 -
611. 有效三角形的个数-排序+二分查找
给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。示例 2:二、解题排序+二分查找abc三条边从小到大排序,构成三角形的条件是a+b>c,如果大于c,说明是三角形,否则不是时间复杂度:O(n^2)空间复杂度:O(logn)。...原创 2022-06-14 10:56:01 · 375 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树:示例 1:示例 2:二、解题递归分治二叉搜索树的后序遍历:最后一个值是根节点,根节点的左子树的值是小于根节点的值,右子树是大于根节点的值,所以使用递归分治算法,从左往右找到第一个大于根节点的值,分割为左右两个子树。分割点为cur,[left,cur-1]小于根节点,[cur,right-1]大于根节点,只需要判断[cur,r原创 2022-06-14 10:06:21 · 139 阅读 · 0 评论 -
7. 整数反转-数学
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)示例 2:示例 3:示例 4:二、解题数学这题需要判断是否溢出时间复杂度:O(log∣x∣)。翻转的次数即 x 十进制的位数。空间复杂度:O(1)。...原创 2022-06-13 22:15:41 · 300 阅读 · 0 评论 -
863. 二叉树中所有距离为 K 的结点-DFS
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。示例 2:二、解题DFS记录每个节点的父节点,然后从target节点开始dfs,找到所有和target节点距离为k的节点,向三个方向寻找。1.左子树 2.右子树 3.向父节点查找时间复杂度:O(n),其中 n 是二叉树的结点个数。空间复杂度:O(n)。......原创 2022-06-13 16:39:46 · 214 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字-二分查找
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。示例 2:二、解题二分查找原创 2022-06-12 22:30:01 · 135 阅读 · 1 评论 -
120. 三角形最小路径和-动态规划
给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。示例 2:二、解题动态规划1、状态定义:dp[i][j] 表示从点 (i, j)(i,j) 到底边的最小路径和。2、状态转移:dp[i][j] = min(dp[i + 1][j], dp[i +原创 2022-06-12 22:04:54 · 104 阅读 · 0 评论 -
556. 下一个更大元素 III-(31. 下一个排列)-两次遍历
给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。示例 2:二、解题两次遍历这题类似于31题下一个排列,只不过这里出现的是给一个正整数,31题是一个数组,所以需要将正整数变为字符数组即可。...原创 2022-06-11 11:50:00 · 115 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置-二分查找、双指针
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:示例 2:示例 3:二、解题二分查找这题进阶需要O(log(n))的时间复杂度,所以就想到二分查找,如果在一个升序的不重复的数组中找一个目标数字比较好写,这里的数组的数字是重复的,所以可以分为找目标值在数组中第一次出现的位置,然后在找第二次出现的位置,然而第二次出现的位置可以转为目标值+1在数组中出现第一次的位置,原创 2022-06-10 11:14:16 · 153 阅读 · 0 评论 -
62. 不同路径-动态规划
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 2:示例 3:示例 4:二、解题动态规划总共多少路径: dp[i][j] = dp[i-1][j] + dp[i][j-1];扩展 : 最短路径: dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])+1;...原创 2022-06-09 10:48:01 · 161 阅读 · 0 评论 -
662. 二叉树最大宽度-BFS
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与**满二叉树(full binary tree)**结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。这个二叉树与满二叉树结构相同,所以我们将这个二叉树重新赋值,然后计算二叉树的节点值,使用双端队列,队尾元素减队头元素获取最大长度!...原创 2022-06-08 09:40:13 · 245 阅读 · 0 评论 -
112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。示例 2:示例 3:二、解题回溯判断是否为叶子节点,如果是叶子节点则判断当前值是否为targetSum。......原创 2022-06-06 10:26:48 · 211 阅读 · 0 评论 -
268. 丢失的数字-异或
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。示例 2:示例 3:示例 4:二、解题异或0 ^ 4 = 44 ^ 4 = 0我们可以先求得 [1, n][1,n] 的异或和 ansans,然后用 ansans 对各个 nums[i]nums[i] 进行异或。这样最终得到的异或和表达式中,只有缺失元素出现次数为 11 次,其余元素均出现两次(x ⊕x = 0x⊕x=0),即最终答案 ansans 为缺失元素。...原创 2022-06-03 22:24:31 · 281 阅读 · 0 评论 -
54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 2:二、解题模拟按上下左右进行模拟,然后判断是否越界时间复杂度:O(n);空间复杂度:O(n)。原创 2022-06-01 22:32:02 · 136 阅读 · 0 评论 -
450. 删除二叉搜索树中的节点-递归
一、题目描述给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例 1:输入:root = [5,3,6,2,4,null,7], key = 3输出:[5,4,6,2,null,null,7]解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。一个正确的答案是原创 2022-05-23 10:46:30 · 240 阅读 · 0 评论 -
26. 删除有序数组中的重复项-一次遍历
一、题目描述给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。判题标准转载 2022-05-04 21:49:38 · 181 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数-排序(179. 最大数)
一、题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459"二、解题排序class Solution { public String minNumber(int[] nums) { //排序 //首先将数组转为字符串数组 int length = nums.lengt原创 2022-05-04 21:25:18 · 260 阅读 · 0 评论 -
18. 四数之和-双指针
一、题目描述给你一个由 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 =原创 2022-05-04 20:45:50 · 74 阅读 · 0 评论 -
264. 丑数 II-动态规划-(263. 丑数)
一、题目描述给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是只包含质因数 2、3 和/或 5 的正整数。示例 1:输入:n = 10输出:12解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2:输入:n = 1输出:1解释:1 通常被视为丑数。二、解题动态规划dp[i] 表示第 i 个丑数,第 n 个丑数即为dp[n]。最小的丑数是 1,因此 dp[1]=1;定义三个指针 p2,p3,p5,表示下原创 2022-05-04 16:32:06 · 1104 阅读 · 0 评论 -
70. 爬楼梯(剑指 Offer 10- II. 青蛙跳台阶问题)-动态规划
一、题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶二、解题动态规划dp[i] = dp[i-1] + dp[i-2]:说明当前台阶可以由前一个台阶原创 2022-05-04 15:59:53 · 590 阅读 · 0 评论 -
134. 加油站-一次遍历
一、题目描述在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。示例 1:输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]输出: 3解释:从原创 2022-05-04 15:50:06 · 279 阅读 · 0 评论 -
977. 有序数组的平方-双指针
一、题目描述给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]二、解题双指针class Solution { public int原创 2022-05-04 11:30:25 · 73 阅读 · 0 评论 -
154. 寻找旋转排序数组中的最小值 II(困难)-二分查找
一、题目描述已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。给你一个可能存在 重复 元原创 2022-05-04 11:08:31 · 121 阅读 · 0 评论 -
84. 柱状图中最大的矩形(困难)-单调栈、哨兵
一、题目描述给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例 1:输入:heights = [2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为 10示例 2:输入: heights = [2,4]输出: 4二、解题单调栈+哨兵这里使用单调栈,为了省去边界的判断,使用哨兵,思想类似于哑结点;哨兵:在数组的两端加0。单调栈就是固定矩形的右边界,往左找最大的面积,原创 2022-05-04 10:54:06 · 195 阅读 · 0 评论 -
125. 验证回文串-双指针
一、题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a canal: Panama"输出: true解释:"amanaplanacanalpanama" 是回文串示例 2:输入: "race a car"输出: false解释:"raceacar" 不是回文串二、解题双指针class Solution { public boolean原创 2022-05-03 21:47:35 · 118 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵-模拟循环(59. 螺旋矩阵 II)
一、题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]二、解题模拟循环主要就是边界的判断,向左向下向左向上循环,每一次循环完后都要判断边界,左>右,上>下clas原创 2022-05-03 21:12:48 · 87 阅读 · 0 评论 -
208. 实现 Trie (前缀树)-字典树
一、题目描述Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean star原创 2022-05-03 20:26:03 · 67 阅读 · 0 评论 -
96. 不同的二叉搜索树-动态规划
一、题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例 1:输入:n = 3输出:5示例 2:输入:n = 1输出:1二、解题动态规划假设 n 个节点存在二叉排序树的个数是 G (n),令 f(i) 为以 i 为根的二叉搜索树的个数:G(n)=f(1)+f(2)+f(3)+f(4)+…+f(n)当 i 为根节点时,其左子树节点个数为 i-1 个,右子树节点为 n-if(i)=G(i−原创 2022-05-03 16:30:06 · 205 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串-动态规划
一、题目描述给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"二、解题动态规划这题与91. 解码方法很相似,只不过这题解码的范围为0-25,另一题是1-26我原创 2022-05-03 11:44:13 · 79 阅读 · 0 评论 -
1004. 最大连续1的个数 III-滑动窗口、双指针
一、题目描述给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。示例 1:输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释:[1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。示例 2:输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3输出:10解释:[0,0,1,1,1,原创 2022-05-03 11:18:35 · 308 阅读 · 0 评论 -
763. 划分字母区间-贪心算法
一、题目描述字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。示例 1:输入:S = "ababcbacadefegdehijhklij"输出:[9,7,8]解释:划分结果为 "ababcbaca", "defegde", "hijhklij"。每个字母最多出现在一个片段中。像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。二、解题贪心算法记原创 2022-05-03 10:47:01 · 175 阅读 · 0 评论 -
253.会议室 II-排序
一、题目描述二、解题排序这题有点类似于452题-用最少数量的箭引爆气球将数组按照左边界升序,然后通过比较,左右两个边界,判断是否需要新的会议室,如果相邻的两个数组不重合,说明开完上一个会,会议室空闲,继续给下一个会议使用,共用一个会议室,如果重叠则需要两个会议室。public class leetcode253 { public static void main(String[] args) { leetcode253 leetcode = new leetcode25原创 2022-05-03 10:17:30 · 263 阅读 · 1 评论 -
剑指 Offer 38. 字符串的排列-全排列-回溯
一、题目描述输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例 1:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]二、解题回溯全排列问题,使用回溯。class Solution { public String[] permutation(String s) { //升序 char[] schar = s.toCharArray();原创 2022-05-02 22:45:20 · 100 阅读 · 0 评论 -
136. 只出现一次的数字-异或
一、题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4二、解题异或这里用到了位运算:异或性质任何数和 0 做异或运算,结果仍然是原来的数:a⊕0=a任何数和其自身做异或运算,结果是 0:a⊕a=0异或运算满足交换律和结合律:a⊕b⊕a=b⊕a⊕a=b⊕原创 2022-05-02 22:20:17 · 191 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子-排序
一、题目描述从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True示例 2:输入: [0,0,1,2,5]输出: True二、解题排序这题就是斗地主中的天地癞子打法,大小王可以变为任意牌,顺子牌就是比较癞子牌的数量与顺子中差的牌的数量的大小,举个例子0,0,1,2,52-5中差3和4凑成原创 2022-05-02 21:51:39 · 296 阅读 · 0 评论 -
340. 至多包含 K 个不同字符的最长子串(困难)-滑动窗口双指针、哈希表
一、题目描述二、解题哈希表、滑动窗口双指针这题的思想就是找K个不同字符的字符串,并且这个连续字符串的长度够长,使用哈希表保存每个字符的最远边界,K个不同的字符可以使用哈希表的长度保存。public int solution(String s, int k){ int len = s.length(); if (len * k == 0) return 0; int left = 0, right = 0; int ans = 0;原创 2022-05-02 11:41:33 · 255 阅读 · 0 评论 -
572. 另一棵树的子树-递归
一、题目描述给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。示例 1:输入:root = [3,4,5,1,2], subRoot = [4,1,2]输出:true示例 2:输入:root = [3,4,5,1,2,null,null,null,原创 2022-05-01 22:17:58 · 98 阅读 · 0 评论