算法刷题记录集合
文章平均质量分 52
刷题
梦否
【@】bug修复,程序代做
展开
-
【LeetCode】1218. 最长定差子序列
文章目录1. 题目描述2. 题解1. 题目描述给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。示例 1:输入:arr = [1,2,3,4], difference = 1输出:4解释:最长的等差子序列是 [1,2,3,4]。示例 2:输入:arr = [1,3,5,原创 2021-11-05 14:28:05 · 110 阅读 · 0 评论 -
【LeetCode】面试题 01.05. 一次编辑
1. 题目描述字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。示例 1:输入:first = “pale”second = “ple”输出: True示例 2:输入:first = “pales”second = “pal”输出: False来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/one-away-lcci2. 解答最初的原创 2021-10-25 09:47:10 · 116 阅读 · 0 评论 -
实现一个添加、删除、随机获得元素都是O(1)的数据结构
1. 分析我们都知道在Java的HashMap中插入和删除的时间复杂度为O(1),故而我们可以考虑使用HashMap来作为底层的数据存储,但是因为HashMap中没有索引,所以在随机获取一个元素的时候做不到时间复杂度为O(1),所以需要引入额外的数据结构ArrayList。在随机获取一个元素的时候,我们就在ArrayList中随机生成一个下标,然后返回其值即可。在添加和删除的时候,使用HashMap来完成。这里需要解决的主要问题就是如何将两者进行关联起来。比如:在删除元素的时候,应该不仅是在Hash原创 2021-09-18 10:04:16 · 842 阅读 · 0 评论 -
【困难】600. 不含连续1的非负整数
1. 题目描述给定一个正整数 n,找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数。示例 1:输入: 5输出: 5解释:下面是带有相应二进制表示的非负整数<= 5:0 : 01 : 12 : 103 : 114 : 1005 : 101其中,只有整数3违反规则(有两个连续的1),其他5个满足规则。说明: 1 <= n <= 109来源:力扣(LeetCode)链接:https://leetcode-cn.com/probl原创 2021-09-11 17:43:55 · 180 阅读 · 2 评论 -
【脑筋急转弯】502. IPO
1. 题目描述假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。给你 n 个项目。对于每个项目 i ,它都有一个纯利润 profits[i] ,和启动该项目需要的最小资本 capital[i] 。最初,你的资本为 w 。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中原创 2021-09-08 11:04:53 · 78 阅读 · 0 评论 -
【脑筋急转弯】1221. 分割平衡字符串
1. 题目描述在一个 平衡字符串 中,’L’ 和 ‘R’ 字符的数量是相同的。给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。注意:分割得到的每个字符串都必须是平衡字符串。返回可以通过分割得到的平衡字符串的 最大数量 。示例 1:输入:s = “RLRRLLRLRL”输出:4解释:s 可以分割为 “RL”、“RRLL”、“RL”、“RL” ,每个子字符串中都包含相同数量的 ‘L’ 和 ‘R’ 。示例 2:输入:s = “RLLLLRRRLR”输出:3解释:s 可以分原创 2021-09-07 16:29:17 · 125 阅读 · 0 评论 -
【LeetCode】300. 最长上升子序列
对于在这道题,在牛客和LeetCode分别有不同的求解目标。1. LeetCode中最长上升子序列题目地址:LeetCode:300. 最长递增子序列1.1 题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是原创 2021-09-06 09:38:13 · 186 阅读 · 0 评论 -
求第K个幸运数字(只由4、7或者他们的组合构成的数称为幸运数字)
记录一道没见过的题【幸运数字】1. 题目描述如题,只由4和7或者他们的组合构成的数字称为幸运数字,这个列表按照从小到达排序。求第K个数是多少。示例1:输入:k = 5输出:74说明K很大,0<K<10180 <K<10^{18}0<K<1018。2. 解答不妨先将之写出来:4, 7, 44, 47, 74, 77, 444, 447, 474, 477, 744, 747, 774, 777... 可以构建这么一颗二叉树:private i原创 2021-08-11 21:43:20 · 1008 阅读 · 0 评论 -
【LeetCode】最小K个数
旨在复习堆排序和快排算法。题目地址:最小K个数1. 题目描述设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]提示:0 <= len(arr) <= 1000000 <= k <= min(100000, len(arr))来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/smallest原创 2021-09-03 09:53:03 · 106 阅读 · 0 评论 -
【LeetCode】数组中的最长连续子序列
本题地址:128. 最长连续序列1. 题目描述给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-consecutive-sequence2. 解答2.1 朴素解法如果我们不考虑要求时间复杂度为 O(n),那么我们可以采用最直观的方式来做这个题。比如:先将数组排序;原创 2021-09-02 15:36:48 · 5552 阅读 · 3 评论 -
【差分数组】1109. 航班预订统计
1. 题目描述这里有 n 个航班,它们分别从 1 到 n 进行编号。有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。请你返回一个长度为 n 的数组 answer,其中 answer[i] 是航班 i 上预订的座位总数。示例 1:输入:bookings = [[1,2,10],[2,原创 2021-08-31 10:48:25 · 152 阅读 · 0 评论 -
528. 按权重随机选择
记录一道比较有意思的题,按权重随机选择,感觉在实际中会用到。1. 题目描述给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 i 的概率与 w[i] 成正比。例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。也就是说,选取下标 i 的概率为 w[i] / su原创 2021-08-30 09:41:35 · 112 阅读 · 0 评论 -
不用for循环找最大值
1. 使用Jdk1.8中的流private static int getMax(int[] arr){ return Arrays.stream(arr).max().getAsInt();}2. 使用递归来代替for/** * 递归的从后往前找最大值,最大值记录在lastVal变量中 * @param arr 待求数组 * @param lastIndex 数组最后一个下标 * @param lastVal 数组最后一个元素 * @return */private stat原创 2021-08-29 20:11:04 · 513 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
1. 题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节原创 2021-08-26 17:31:59 · 79 阅读 · 0 评论 -
【Java】求最大公约数
首先做这个题需要先复习几组概念:如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。举例:12,1612的约数有:1,2, 3, 4, 6, 1216的约数有:1, 2, 4, 8, 16故而最大的公约数为4。求最大公约数有多种方法,常见的有辗转相除法。1. 朴素解——暴力求解观察性质或者案例,我们可以知道最大公约数一定满足(对于数A和数B来说,最大公约数C),A%C=0且B%C=0。且最原创 2021-08-20 21:13:42 · 4557 阅读 · 1 评论 -
576. 出界的路径数
1. 题目描述给你一个大小为 m x n 的网格和一个球。球的起始坐标为 [startRow, startColumn] 。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove 次球。给你五个整数 m、n、maxMove、startRow 以及 startColumn ,找出并返回可以将球移出边界的路径数量。因为答案可能非常大,返回对 109 + 7 取余 后的结果。来源:力扣(LeetCode)链接:https://leetcode-cn.原创 2021-08-15 23:26:45 · 107 阅读 · 0 评论 -
516. 最长回文子序列
1. 题目描述给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例 1:输入:s = “bbbab”输出:4解释:一个可能的最长回文子序列为 “bbbb” 。示例 2:输入:s = “cbbd”输出:2解释:一个可能的最长回文子序列为 “bb” 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-pal原创 2021-08-12 11:55:20 · 162 阅读 · 0 评论 -
KMP (Knuth-Morris-Pratt)算法,算法【28. 实现 strStr()】
文章目录1. 题目描述2. 解答2.1 朴素求解2.2 KMP算法2.2.1 next数组的构建2.2.2 模拟使用next数组时的匹配过程2.2.4 next数组代码实现2.2.5 匹配过程实现1. 题目描述28. 实现 strStr()实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返原创 2021-08-10 20:45:46 · 108 阅读 · 0 评论 -
313. 超级丑数
1. 题目描述超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。给你一个整数 n 和一个整数数组 primes ,返回第 n 个 超级丑数 。题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。示例 1:输入:n = 12, primes = [2,7,13,19]输出:32解释:给定长度为 4 的质数数组 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。原创 2021-08-09 10:26:50 · 154 阅读 · 0 评论 -
456. 132 模式
刷题记录第27题。本题地址:132 模式1. 题目描述给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false 。示例 1:输入:nums = [1,2,3,4]输出:false解释:序列中不存在 1原创 2021-08-03 12:04:15 · 104 阅读 · 0 评论 -
322. 零钱兑换
刷题记录第26题。本题地址:零钱兑换给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coi原创 2021-08-02 20:22:08 · 79 阅读 · 0 评论 -
416. 分割等和子集
刷题记录第25题。本题地址:分割等和子集给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例 1:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。示例 2:输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等的子集。提示:1 <= nums.length <= 2001 <= nums[原创 2021-08-02 15:30:57 · 147 阅读 · 0 评论 -
子集Java——回溯法
刷题记录第24题,上一题:1~n 整数中 1 出现的次数,本题地址:子集。给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]思路:每次固定窗口大小,进行该窗口下的组合,使用回溯法可以找到所有:c原创 2021-07-23 13:06:14 · 314 阅读 · 0 评论 -
1~n 整数中 1 出现的次数
刷题记录第23题,上一题:字符串的排列,本题地址:1~n 整数中 1 出现的次数。题目描述:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 1:输入:n = 12输出:5示例 2:输入:n = 13输出:6限制:1 <= n < 2^31发现了一个大佬,大佬讲的太清晰了,地址:LeetCode刷题力扣题解 | 剑指Offer 43. 1~n 整数中 1原创 2021-07-12 19:26:28 · 140 阅读 · 0 评论 -
数据流中的中位数Java
刷题记录第21题,上一题:数组中的逆序对,本题地址:数据流中的中位数。在上篇的PriorityQueue的解读中,基本上了解了PriorityQueue这个容器的一些知识,所以这里来巩固一下。题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下原创 2021-07-11 16:12:30 · 146 阅读 · 0 评论 -
数组中的逆序对Java
刷题记录第20题,上一题:不用加减乘除做加法,本题地址:数组中的逆序对。为什么记录这个题呢,是因为解题使用了归并排序,而归并排序自己又忘记了。它的求解过程可以描述为下面的一张图:这张图来自:剑指 Offer 51. 数组中的逆序对(归并排序,清晰图解)也就是说,首先我们需要先写一个归并排序出来。private int count = 0; // 计数变量public int reversePairs(int[] nums) { getPairsNumber(nums, 0, num原创 2021-07-11 09:50:46 · 211 阅读 · 0 评论 -
不用加减乘除做加法Java
刷题记录第19题,上一题:把数组排成最小的数,本题地址:不用加减乘除做加法。这道题比较有意思。因为之前其实做过,知道使用位运算来做,但是在这次做的时候,却又忘记了。在计算机中的计算为二进制补码运算。观察两个数的相加,比较容易知道两个数的相加的进位的二进制表示可以用位与运算左移一位得到;两个数相加的非进位的二进制表示可以用位异或运算得到。粘贴下改题目大佬的题解分析:还找到了一个相关的文章:不使用“+”,“-”,“×”,“÷”实现四则运算递归实现:class Solution { pu原创 2021-07-08 19:29:32 · 149 阅读 · 0 评论 -
把数组排成最小的数Java
刷题记录第18题,上一题:机器人的运动范围,本题地址:把数组排成最小的数。这个题看着题意确实比较难。但是在解答区中,我看了下发现这个问题就是一个排序问题。比如:3 和 30的可能组合:330 和 303那么,我们可以判定知道303较小,那么30“小于”3。这种逻辑关系。类似的可以对整个数组进行类似的比较和排序。然后从小到大进行连接即可。class Solution { public String minNumber(int[] nums) { String[] str原创 2021-07-07 20:58:38 · 233 阅读 · 0 评论 -
机器人的运动范围
刷题记录第17题,上一题:连续子数组的最大和,本题地址:机器人的运动范围。终于,这个题是自己做出来的。class Solution { public int movingCount(int m, int n, int k) { if (m < 1 || n < 1) return 0; boolean[][] visite = new boolean[m][n]; return getCount(visite, 0, 0, 0, k)原创 2021-07-06 09:15:32 · 103 阅读 · 0 评论 -
连续子数组的最大和Java
刷题记录第16题,上一题:包含min函数的栈,本题地址:连续子数组的最大和。给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。官方的思路很好,记录下:nums = [-2,1,-3,4,-1,2,1,-5,4]那么,每次的比较数据最大值为:[-2,-1, -2,4,3,5,6, 1,5]可原创 2021-07-04 10:15:02 · 214 阅读 · 0 评论 -
包含min函数的栈Java
刷题记录第15题,上一题:顺时针打印矩阵,本题地址:包含min函数的栈。又刷到了一个比较有意思的题。给定的模板为:class MinStack { /** initialize your data structure here. */ public MinStack() { } public void push(int x) { } public void pop() { } public int top() {原创 2021-07-04 09:54:17 · 108 阅读 · 0 评论 -
顺时针打印矩阵Java
刷题记录第14题,上一题:无符号整数的二进制表达中1的个数,本题地址:顺时针打印矩阵。为什么这个题是简单题。没做出来。注意到一件事情,即始终都是四个操作一个轮回。那么有下面的这个代码class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return new int[0];原创 2021-07-03 21:16:00 · 73 阅读 · 0 评论 -
无符号整数的二进制表达中1的个数Java
刷题记录第13题,上一题:求根节点到叶节点数字之和,本题地址:无符号整数的二进制表达中1的个数。昨天看到了一个大佬的推荐刷题顺序,剑指offer->hot 100 -> top 100。所以就开始了刷剑指offer的刷题,就没怎么记录了。这道题也是剑指offer中的题目,且所属为简单题,因为我不知道怎么处理无符号数,所以这里记录下。不妨来尝试做下。首先注意到是32为无符号int类型,故而最大的数为32个1的表达。在有符号中的表达也就是-1(因为在计算机中是二进制补码运算,有符号中1表原创 2021-07-03 20:25:41 · 422 阅读 · 0 评论 -
求根节点到叶节点数字之和Java
刷题记录第12题,上一题:左叶子之和,本题地址:求根节点到叶节点数字之和。给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。叶节点 是指没有子节点的节点。示例 1:输入:root = [1,2,3]输出:25解释:从根到叶子节点路径 1->2 代表数字 12从根到叶子节点路原创 2021-07-02 12:41:04 · 289 阅读 · 0 评论 -
求从根节点到叶子节点的所有路径Java
二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: [“1->2->5”, “1->3”]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3class Solution { public List<String> binaryTreePaths(TreeNode root) { i原创 2021-07-02 08:57:48 · 2033 阅读 · 1 评论 -
左叶子之和Java
刷题记录第11题,上一题:路径总和,本题地址:左叶子之和。计算给定二叉树的所有左叶子之和。示例: 3 / \ 9 20 / \ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24使用层序遍历,我们只需要对每个节点标识下是否属于左边子树的节点即可。class Solution { class Node{ TreeNode node; boolean isLeft; public原创 2021-07-01 19:06:44 · 156 阅读 · 0 评论 -
路径总和Java
刷题记录第10题,上一题:平衡二叉树,本题地址:路径总和。给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true虽然这个逻辑比较简单,就是递归的减去当前值,然后判断为叶子节点的时候,原创 2021-07-01 15:08:42 · 148 阅读 · 0 评论 -
平衡二叉树Java
刷题记录第10题,上一题:对称二叉树,本题地址:平衡二叉树。给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true我们需要比较树中的左右子树的高度差,所以我们需要求树的高度。class Solution { public boolean isBalanced(TreeNode root) {原创 2021-07-01 14:42:11 · 81 阅读 · 0 评论 -
完全二叉树的节点个数Java
刷题记录第10题,上一题:对称二叉树,本题地址:完全二叉树的节点个数。给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。其实也就是对其遍历,最简单的做法可以定义个全局变量来计数:class Solution { private int count = 0; public原创 2021-07-01 12:04:55 · 182 阅读 · 0 评论 -
对称二叉树Java
刷题记录第10题,上一题:相同的树,本题地址:对称二叉树。给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3根据上题相同的树,以及翻转二叉树。我们可以直接递归进行检查树是否相同。当然,最简单的思路首先应该是层序遍历方原创 2021-07-01 09:28:40 · 75 阅读 · 0 评论