算法
文章平均质量分 58
玉面大蛟龙
00后阿里巴巴后端工程师
展开
-
剑指 Offer II 070(力扣540):排序数组中只出现一次的数字(Java二分查找)
给定一个只包含整数的有序数组 ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。你设计的解决方案必须满足 时间复杂度和 空间复杂度。示例 1:输入: nums = [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: nums = [3,3,7,7,10,11,11]输出: 10提示: 找个数的题目,用HashMap可以通杀。使用哈希表保存每个数字出现的次数,然后找到值为1的即可。 时间复杂度: O(N)原创 2022-12-04 15:52:21 · 1111 阅读 · 2 评论 -
力扣46:全排列(Java回溯)
给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以返回答案。原创 2022-12-01 11:21:27 · 798 阅读 · 0 评论 -
力扣560:和为 K 的子数组(Java)
给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的连续子数组的个数。22。原创 2022-11-28 17:43:53 · 656 阅读 · 0 评论 -
力扣64:最小路径和(Java)
给定一个包含非负整数的m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。每次只能向下或者向右移动一步。7因为路径 1→3→1→1→1 的总和最小。12。原创 2022-11-27 16:18:47 · 447 阅读 · 0 评论 -
力扣739:每日温度 (Java多种方法)
给定一个整数数组,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。原创 2022-11-26 16:40:35 · 980 阅读 · 0 评论 -
力扣208:实现 Trie (前缀树) (Java多种数据结构)
(发音类似 "try")或者说是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。Trie()wordwordtruefalsewordprefixtruefalse// 返回 True// 返回 False// 返回 True// 返回 TrueprefixinsertsearchstartsWith3 * 104。原创 2022-11-24 16:40:35 · 126 阅读 · 0 评论 -
打家劫舍系列(力扣198、213、337)Java动态规划
此题的动态规划有两种思路:1、参考,我也写的有题解:房屋只有两种状态:被偷 和 没被偷那么我们用dp数组来记录第i间房屋时的最大金额,dp[i][0] 记录被偷的情况,dp[i][1]记录没被偷的情况。dp[i][0]表示被偷,那么前一间必然没有被偷,当前值就是前一间没有被偷的情况下的金额+当前金额,则dp[i][0] = dp[i-1][1] + nums[i]原创 2022-11-23 16:28:27 · 549 阅读 · 0 评论 -
买卖股票系列(力扣121、122、123、188、309、714) Java动态规划
使用两个变量,一个变量max来保存截止到当天获得的最大利润,另一个变量min来保存截止到当天股票的最小价格,动态规划即可求出所有的当天价格中,最大的价格。原创 2022-11-21 16:37:01 · 464 阅读 · 0 评论 -
力扣155:最小栈(Java 辅助栈 -> 不使用额外空间)
设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStackMinStack()void pop()int top()--> 返回 -3.--> 返回 0.--> 返回 -2.topgetMinpushpoptopgetMin3 * 104。原创 2022-10-24 16:19:30 · 963 阅读 · 1 评论 -
力扣207:课程表(Java拓扑排序:bfs+dfs)
你这个学期必须选修numCourses门课程,记为0到。在选修某些课程之前需要一些先修课程。先修课程按数组给出,其中,表示如果要学习课程ai则先学习课程bi。[0, 1]01请你判断是否可能完成所有课程的学习?如果可以,返回true;否则,返回false。true总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。这是可能的。false总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。原创 2022-10-23 16:07:04 · 731 阅读 · 0 评论 -
力扣448:找到所有数组中消失的数字(Java 鸽笼原理)
给你一个含n个整数的数组nums,其中nums[i]在区间[1, n]内。请你找出所有在[1, n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。[5,6][2]你能在不使用额外空间且时间复杂度为O(n)的情况下解决这个问题吗?你可以假定返回的数组不算在额外空间内。原创 2022-10-23 11:39:14 · 373 阅读 · 0 评论 -
力扣200:岛屿数量(Java dfs+bfs)
给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。原创 2022-10-21 18:41:18 · 359 阅读 · 0 评论 -
力扣215:数组中的第K个最大元素(Java快速查找、计数排序、堆排序)
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。原创 2022-10-07 16:39:46 · 1348 阅读 · 0 评论 -
剑指 Offer 51:数组中的逆序对 (Java分治思想)
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5限制:0原创 2022-10-06 16:46:08 · 172 阅读 · 0 评论 -
力扣470:用 Rand7() 实现 Rand10() Java
(randx() - 1) * Y的范围是[0, (X-1)*Y],(randx() - 1) * Y + randY()的范围自然就是[1, X * Y]。比如我们有rand10(),想要写出rand7(),那只要不断地调用rand10()就可以了,因为rand10生成1,2,3,4,5,6,7是随机的。这个程序用来完成题目是没有问题的,但是我们可以发现,生成的数字在1~49之间,然而我们利用的数字只有1~10,有一大半的数字没有利用,这样大大地增加了while循环的次数,效率偏低。原创 2022-10-05 16:47:29 · 709 阅读 · 0 评论 -
力扣300:最长递增子序列(Java动态规划+双指针)
给你一个整数数组 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。原创 2022-10-04 16:58:34 · 1223 阅读 · 0 评论 -
力扣2248:多个数组求交集(Java多种方法)
给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在 nums 所有数组中都出现过。示例 1:输入:nums = [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]输出:[3,4]解释:nums[0] = [3,1,2,4,5],nums[1] = [1,2,3,4],nums[2] = [3,4,5,6],在 nums 中每个数组中都出现的数字是 3 和 4 ,所以返回 [3,4]。原创 2022-10-04 15:18:40 · 1293 阅读 · 0 评论 -
力扣15:三数之和 (Java三指针)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= j、i!= k 且 j!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]解释:不同的三元组是 [-1,0,1] 和 [-1,-1,2]。原创 2022-10-03 15:48:33 · 647 阅读 · 0 评论 -
力扣33. 搜索旋转排序数组 Java无顺序数组的二分查找
整数数组 nums 按升序排列,数组中的值 互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0原创 2022-09-30 21:12:45 · 134 阅读 · 0 评论 -
力扣322. 零钱兑换 Java动态规划
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。原创 2022-09-29 21:09:47 · 361 阅读 · 0 评论 -
剑指 Offer 62 圆圈中最后剩下的数字 Java
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。原创 2022-09-28 18:02:24 · 434 阅读 · 0 评论 -
剑指 Offer 68 - I: 二叉搜索树的最近公共祖先 Java递归
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6。原创 2022-09-28 15:56:05 · 82 阅读 · 0 评论 -
剑指 Offer 64:求1+2+…+n Java逻辑符短路
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。原创 2022-09-28 15:29:33 · 204 阅读 · 0 评论 -
剑指 Offer 57 - II 和为s的连续正数序列 Java滑动窗口
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。原创 2022-09-27 19:09:51 · 74 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数 Java自定义排序
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: "102"示例 2:输入: [3,30,34,5,9]输出: "3033459"提示:说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0。原创 2022-09-27 16:31:07 · 124 阅读 · 0 评论 -
剑指Offer II 031. 最近最少使用缓存(LRU)
运用所掌握的数据结构,设计和实现一个 LRU (Least Recently Used,最近最少使用) 缓存机制。原创 2022-09-12 20:29:36 · 332 阅读 · 0 评论 -
重排链表(力扣 143)Java思路由浅入深
一、题目描述给定一个单链表 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]示例 2:输入:head = [1,2,3,4,5]输出:[1,5,2,4,3]提示:链表的长.原创 2022-03-24 22:46:05 · 1285 阅读 · 0 评论 -
移动零(力扣热题HOT100 之 力扣283)java
目录一、题目描述二、思路讲解三、Java代码实现三、代码优化给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例 1:输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]示例 2:输入: nums = [0]输出: [0] 提示:1 ...原创 2022-06-25 15:25:44 · 268 阅读 · 0 评论 -
二叉树中的最大路径和(力扣热题HOT100 之 力扣124)java
目录一、题目描述二、思路讲解三、java代码实现四、时空复杂度一、题目描述路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。示例 1:输入:root = [1,2,3]输出:6解释:最优路径是 2 -> 1 -> 3 ,路径.原创 2022-04-14 00:48:41 · 157 阅读 · 0 评论 -
最长连续序列(力扣热题HOT100 之 力扣128)Java
目录一、题目描述二、思路讲解三、Java代码实现四、思路优化五、优化代码一、题目描述给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。示例 2:输入:nums = [0,3,7,2,5,8,4,6,...原创 2022-04-13 10:46:47 · 904 阅读 · 0 评论 -
二叉树展开为链表(力扣热题HOT100 之 力扣114)Java
目录一、题目描述二、思路讲解三、Java代码实现四、时空复杂度分析五、进阶一、题目描述给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。示例 1:输入:root = [1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,null...原创 2022-04-12 15:11:56 · 185 阅读 · 0 评论 -
只出现一次的数字(力扣136)java多种思路讲解
一、题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例2:输入: [4,1,2,1,2]输出: 4二、思路讲解与代码实现 首先很容易想到的是排序,排序了之后,只存在一个的数字(后面简称为目标数字)的左右必然都不是与他相等的数字。 这个时候需要考虑目标数...原创 2022-04-10 23:34:59 · 205 阅读 · 0 评论 -
跳跃游戏(力扣热题HOT100 之 力扣55)Java 贪心
一、题目描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以.原创 2022-04-08 23:41:33 · 115 阅读 · 0 评论 -
回文字串(力扣热题HOT100 之 力扣647)java多种方法
一、题目描述给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:s = "aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aa原创 2022-04-08 00:31:41 · 664 阅读 · 0 评论 -
最大正方形(力扣热题HOT100 之 力扣221)java动态规划
目录一、题目描述二、思路讲解三、Java代码实现四、时空复杂度分析一、题目描述在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。示例 1:输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]输出:4示例 2:输入:matrix = [["0","1"]..原创 2022-04-07 11:00:38 · 699 阅读 · 0 评论 -
平衡二叉树(剑指offer55-II 力扣110)Java
一、题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 ...原创 2022-03-22 22:08:34 · 85 阅读 · 0 评论 -
队列的最大值(剑指offer59-II)
目录一、题目描述二、思路讲解三、Java代码实现四、时空复杂度分析一、题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:["MaxQueue","push_back","push_back","max_value","pop_front","max...原创 2022-03-22 14:56:46 · 469 阅读 · 0 评论 -
接雨水(力扣42)Java 思路循序渐进
一、题目描述给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == height.length1 <= n ..原创 2022-03-16 13:54:33 · 185 阅读 · 0 评论 -
二叉树中和为某一值的路径(剑指offer34 力扣113)Java深度优先遍历
一、题目描述给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例 1:输入: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:输入原创 2022-02-26 20:17:07 · 329 阅读 · 0 评论 -
数字序列中某一位的数字(剑指offer44 力扣400)Java迭代
一、题目描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。示例 1:输入:n = 3输出:3示例 2:输入:n = 11输出:0限制:0 <= n < 2^31二、思路讲解找规律的题目,就看脑筋能不能急转弯了。可以知道,一位数一共有9个,二位数一共有99个,三位数...原创 2022-02-26 17:47:39 · 220 阅读 · 0 评论