- 博客(60)
- 收藏
- 关注
原创 力扣-228. 汇总区间
题目并不是很难,主要的点是阅读信息:题目里明确说了最小有序,并且是一个区间范围。因为长时间没做过算法题了,所以第一个想到的是双指针,通过找到对应的区间并记录下标的方式来破解此题:利用j去寻找区间的右侧端点,找到后用ans存储;i用来保证遍历的充分性并且找出零散的点。的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于。列表中的每个区间范围。
2023-11-12 20:21:39 265
原创 1109. 航班预订统计
这里为什么要使用差分数组呢?因为这里的预订记录实际上代表了一个区间的增量。这道题大多数朋友上来肯定是暴力就做,但是还有一种比较好的方法是使用差分数组。本题比较困难的点在于:大多数新手可能不太清楚什么是差分数组。并且我们需要注意如何使用差分数组去求原始数组的某一个确定值,如何判断改变某一个区间元素后再求得其新的差分数组;预订记录 3 : 25 25 25 25。因此,answer = [10,55,45,25,25]预订记录 1 : 10 10。预订记录 1 : 10 10。
2023-08-01 18:54:14 380
原创 154. 寻找旋转排序数组中的最小值 II
说明:这道题目看似复杂,其实只是在题目背景上以旋转数组为拓展做了文章,其底层逻辑还是简单的使用二分法来进行遍历,从而查找出数组中最值的问题,只需要使用二分法的逻辑去遍历数组并且返回最小值就可以了。,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。你必须尽可能减少整个过程的操作步骤。的数组,预先按照升序排列,经由。
2023-07-27 16:28:32 381
原创 1250. 检查「好数组」
给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。输入:nums = [12,5,7,23]输入:nums = [29,6,10]解释:挑选数字 29, 6 和 10。解释:挑选数字 5 和 7。
2023-02-16 22:37:10 98
原创 867. 转置矩阵
类似的矩阵翻转题目,都可以采用中这种方法:直接创建一个新的矩阵,然后通过遍历的方法给这个矩阵按照一定的特性赋值。只要原矩阵和新矩阵的数值不变,都可以考虑这种方法。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。输入:matrix = [[1,2,3],[4,5,6]]输出:[[1,4,7],[2,5,8],[3,6,9]]输出:[[1,4],[2,5],[3,6]]
2023-02-15 16:52:53 80
原创 455. 分发饼干
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。但是,每个孩子最多只能给一块饼干。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。输入: g = [1,2,3], s = [1,1]输入: g = [1,2], s = [1,2,3]
2023-02-14 22:24:40 64
原创 2553. 分割数组中数字的数位
说明:题中很明显能想到通过遍历每个 元素来求解的方法,只是需要注意优化的时候,rs[i] = sb.charAt(i) - '0'这句:后半部分都是ASC码进行的运算,所以此时需要结合ASC码来判断,只有当数字减去‘0’对应的ASC码后,才能得到对应的数字。比方说,整数 10921 ,分割它的各个数位得到 [1,0,9,2,1]。输出:[1,3,2,5,8,3,7,7]输入:nums = [7,1,3,9]输出:[7,1,3,9]
2023-02-10 09:40:25 265
原创 1145. 二叉树着色游戏
每一回合,玩家选择一个被他染过色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色(「一号」玩家染红色,「二号」玩家染蓝色)。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。输入:root = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3。「一号」玩家给值为 x 的节点染上红色,而「二号」玩家给值为 y 的节点染上蓝色。解释:第二个玩家可以选择值为 2 的节点。
2023-02-09 17:37:26 255
原创 374. 猜数字大小
题目中给出了需要完成的操作:查找给出的随机数, 所以这里只需要简单的进行查找后返回即可,查找的方法采用二分法较为简便。每轮游戏,我都会从 1 到 n 随机选择一个数字。请你猜选出的是哪个数字。0:我选出的数字和你猜的数字一样。如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。-1:我选出的数字比你猜的数字小 pick < num。1:我选出的数字比你猜的数字大 pick > num。输入:n = 10, pick = 6。输入:n = 1, pick = 1。注意:这里需要实现接口。
2023-02-07 12:46:31 400
原创 232. 用栈实现队列
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。若出队栈无元素,我们的需求又是出队的话,我们就需要将入队栈的内容反序导入出队栈,然后弹出栈顶即可。知道两者特性之后,我们需要用两个栈来模拟队列的特性,一个栈为入队栈,一个栈为出对栈。解释:队列的特性是 FIFO(先入先出),而栈的特性是 FILO(先入后出)。
2023-02-06 12:32:25 223
原创 1669. 合并两个链表
题目中明确告知next这个属性,但是对链表有所了解的朋友肯定知道,链表是有两个指针的,会进行双向指向,也就是链表中起连接作用的那部分。可以先遍历出list1在a-1处以及b+1处元素的next指针,之后分别给它们重新赋值,这样就不需要进一步先删除再拼接,只需要直接将链表a到b段替换就可以了。输入:list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]输出:[0,1,2,1000000,1000001,1000002,5]
2023-02-02 10:52:27 73
原创 350. 两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。说明:本题思路比较清楚,只需要找到相同数字并且返回重复的最少次数即可。数组问题大多可以使用双指针做出,也可以使用哈希表来做。这里采用排序+双指针的思路来做,比较清晰。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]
2023-02-01 12:28:03 54
原创 141. 环形链表
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递。本题相对简单,在题目中只需要知道可以通过next方法来返回下一个节点处的值,然后写一个验证环形链表的if条件就行。如果链表中存在环 ,则返回 true。给你一个链表的头节点 head ,判断链表中是否有环。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。
2023-01-30 18:17:53 51
原创 122. 买卖股票的最佳时机 II
对于初始状态,根据状态定义我们可以知道第 00 天交易结束的时候 dp[0][0]=0dp[0][0]=0,dp[0][1]=−prices[0]dp[0][1]=−prices[0]。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。总利润为 4 + 3 = 7。
2023-01-19 22:18:41 73
原创 202. 快乐数
本题之中需要明确的一个点是,这里的数字不会陷入死循环状态,根据验算我们可以知道数字很大的时候通过squareSum进行计算后数字的值会急速下降。因此,我们在这里使用经典的快慢指针算法,只需要验证导致循环的条件是什么就可以。当然,也可以使用集合来判断是否产生重复数,产生且不为1,则说明不是;两种方法都是采用了判断重复条件的思想,但是相对来说快慢指针的方法会更快且不会存在存储的数字太多越界的事故。对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。如果这个过程 结果为 1,那么这个数就是快乐数。
2023-01-18 12:17:09 603
原创 575. 分糖果
本题思路比较容易出来,要想知道能吃几种糖果,首先要分析糖果种类和能吃的糖果的数量的关系,如果糖的种类少,那能吃再多也只能是有限数量的糖果种类;反之,如果吃的数量没有种类多,那么种类再多也只能吃有限数量的糖。所以,这里利用Set起到去重的效果,筛选出糖果的种类,只需要比较这二者的值,然后返回较小的结果就可以。给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的 最多 种类数。输入:candyType = [1,1,2,2,3,3]
2023-01-17 12:49:09 67
原创 290. 单词规律
这道题相对简单,只是在其中运用了大量Java的底层方法,需要结合API好好看看,思路很容易出,但是具体实现方法还得看对API的了解程度。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。输入: pattern = "abba", s = "dog cat cat dog"输入:pattern = "abba", s = "dog cat cat fish"给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。
2023-01-16 16:37:32 60
原创 剑指 Offer 10- I. 斐波那契数列
根据状态转移方程和边界条件,可以得到时间复杂度和空间复杂度都是 O(n)O(n) 的实现。由于 F(n)F(n) 只和 F(n-1)F(n−1) 与 F(n-2)F(n−2) 有关,因此可以使用「滚动数组思想」把空间复杂度优化成 O(1)O(1)。这里简单举例了两种方法,方法二是基本的递归思想,但实际应用时候会发现这个方法会超出运行时间,所以这里采用第一种解法,动态规划的方法。
2023-01-13 08:23:09 59
原创 414. 第三大的数
题目比较简单,注意此时遍历的时候可以从末尾开始遍历,遍历三个不同的数输出第三个数字就可以。注意角标不要越界了。给你一个非空数组,返回此数组中 第三大的数。如果不存在,则返回数组中最大的数。解释:第三大的数不存在, 所以返回最大的数 2。解释:第三大的数是 1。输入:[3, 2, 1]
2023-01-12 16:10:51 51
原创 278. 第一个错误的版本
本题目比较简单,看见搜索问题直接用二分法来处理,但是需要很好的理解题目,这里的isBadVersion方法是内置的方法,并不是自己写的,只需要知道返回的是一个布尔变量,传入的形参是端口号就可以。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。调用 isBadVersion(4) -> true。所以,4 是第一个错误的版本。
2023-01-11 12:20:43 49
原创 219. 存在重复元素 II
我们可以将数组中的元素一个个放入哈希表中,放入前进行一次类型匹配,满足题意直接返回true,不满足就继续放入,如果最后循环结束仍未有符合条件的元素出现,就返回false。给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j)
2023-01-10 09:36:07 44
原创 268. 丢失的数字
但在这里,我们可以通过先进行升序的排序,将元素对比的范围变为一个确定的数字,即这个元素对应的下标。但是,有一种特殊情况,这个范围是闭区间,我们这种做法没办法保证右侧的区间顶点闭合,所以我们可以将返回的数值初始化为右侧顶点,这样就可以完美解决。解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
2023-01-09 12:36:31 45
原创 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。题目比较简单,这里使用的是双指针的做法,这样方便于将0与非0元素区分开,之后分别进行交换。请注意 ,必须在不复制数组的情况下原地对数组进行操作。输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]输入: nums = [0]
2023-01-05 10:30:38 45
原创 26. 删除有序数组中的重复项
说明:因为这里遍历数组和更改数值的控制变量无法有统一的增减性,所以这里采用双指针的做法来简化代码。因为java无法更改数组的长度,所以这里仅将答案赋值在数组的前几项,后面的几项随机。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [1,1,2]
2023-01-04 08:59:10 38
原创 88. 合并两个有序数组
5,6] ,其中斜体加粗标注的为 nums1 中的元素。最终,合并后数组不应由函数返回,而是存储在数组。需要合并 [1,2,3] 和 [2,5,6]。题目不难,这里仅展示最简单的方法。个元素表示应合并的元素,后。中,使合并后的数组同样按。
2023-01-03 09:23:55 39
原创 6279. 数组乘积中的不同质因数数目
nums 中所有元素的乘积是:2 * 4 * 3 * 7 * 10 * 6 = 10080 = 25 * 32 * 5 * 7。给你一个正整数数组 nums ,对 nums 所有元素求积之后,找出并返回乘积中 不同质因数 的数目。如果 val2 / val1 是一个整数,则整数 val1 是另一个整数 val2 的一个因数。质数 是指大于 1 且仅能被 1 及自身整除的数字。输入:nums = [2,4,3,7,10,6]共有 4 个不同的质因数,所以返回 4。
2023-01-02 17:52:51 218
原创 66. 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。本题相对来说比较简单,只需要注意如何区别某位是9的这种情况就可以。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。输入:digits = [1,2,3]解释:输入数组表示数字 123。输出:[1,2,4]
2022-12-30 10:07:48 57
原创 200. 岛屿数量
即,将陆地‘1’作为目标,当遍历到‘1’时,我们再同时在底层遍历与‘1’相关的上下左右区域,并且标记为‘2’,说明已经遍历过了。遍历的时候,我们通过使用递归的思想,再次调用dfs进行遍历,这样就会在底层一次性将所有‘1’相连的区域遍历并标注完,而这样一块区域就是一个岛屿。由此则可以看懂代码。反之,如果用grid【i】来当做条件,则会出现角标越界的问题(这个时候也可以将||改为|,这样会通过断触的方式来避免角标越界);2. 需要注意这里的DFS思想,并不是一次性遍历所有的区域,而是查找符合目标的区域并标记。
2022-12-29 10:16:02 140
原创 35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。本题非常简单,在这里简单分享一下,当然,遍历的题还是二分法最爽。请必须使用时间复杂度为 O(log n) 的算法。
2022-12-28 17:49:29 45
原创 20. 有效的括号
本题可以用HasMap直接进行查找,也可以采用其他方法来遍历查询,更可以对本代码进行优化处理,这里仅展示比较简单的基础的方法,让刚学的朋友可以读懂。给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。每个右括号都有一个对应的相同类型的左括号。左括号必须用相同类型的右括号闭合。输入:s = "()[]{}"左括号必须以正确的顺序闭合。输入:s = "()"输入:s = "(]"
2022-12-27 09:22:12 38
原创 搜索二维矩阵
本题采用了三种方法来做:暴力输出,建立坐标系,二维转一维用二分法解决。三种方法都比较简单,当然也可以有其他方法,比如直接用二分法来做。有不懂的可以再细talk评论区。编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。每行的第一个整数大于前一行的最后一个整数。每行中的整数从左到右按升序排列。
2022-12-26 12:51:07 48
原创 1025. 除数博弈
只有在爱丽丝在游戏中取得胜利时才返回 true。假设两个玩家都以最佳状态参与游戏。最初,黑板上有一个数字 n。选出任一 x,满足 0 < x < n 且 n % x == 0。解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。爱丽丝和鲍勃一起玩游戏,他们轮流行动。用 n - x 替换黑板上的数字 n。如果玩家无法执行这些操作,就会输掉游戏。解释:爱丽丝选择 1,鲍勃无法进行操作。
2022-11-18 16:51:49 528
原创 775. 全局倒置与局部倒置
本题最特殊的就是输出true的情况,而想达到这种情况,需要一个隐性的条件,即-->使下标为i的数组元素与i的距离不能超过1;如果超过了,则一定会有至少两个数字乱序颠倒位置,这样会使局部倒置数量减少。当数组 nums 中 全局倒置 的数量等于 局部倒置 的数量时,返回 true;给你一个长度为 n 的整数数组 nums ,表示由范围 [0, n - 1] 内所有整数组成的一个排列。解释:有 1 个全局倒置,和 1 个局部倒置。解释:有 2 个全局倒置,和 1 个局部倒置。输入:nums = [1,0,2]
2022-11-16 19:23:04 54
原创 牛客:验证年龄
修改年龄时判断其范围,若年龄小于0则按0输出,若年龄大于200则按200输出。总结:本题较为简单,不做过多赘述,详情参考代码即可。3. 若年龄介于[0,200]之间则直接输出。2. 若年龄大于200则输出200;1. 若年龄小于0则输出0;
2022-11-16 19:17:50 172
原创 303. 区域和检索 - 数组不可变
int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + ... + nums[right] )将前缀和数组 \textit{sums}sums 的长度设为 n+1n+1 的目的是为了方便计算 \text{sumRange}(i,j)sumRange(i,j),不需要对 i=0i=0 的情况特殊处理。
2022-11-15 09:07:48 45
原创 构建乘积数组
给定一个数组 A[0,1,...,n-1] ,请构建一个数组 B[0,1,...,n-1] ,其中 B 的元素 B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1](除 A[i] 以外的全部元素的的乘积)。(注意:规定 B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2])总结:这里的方法实现时需要注意,不能用处法,所以单纯使用for遍历不行,只能加if判断来区分情况。
2022-11-15 09:02:32 43
原创 编写个人所得税计算程序
个人所得税是国家对本国公民、居住在本国境内的个人的所得和境外个人来源于本国的所得征收的一种所得税。假设某地区的起征点为3500元(即月工资低于3500时不需要缴纳个人所得税),个人所得税的计算公式为:应纳税额=(工资薪金所得-扣除数)×适用税率-速算扣除数。其中,扣除数为3500元,适用税率以及速算扣除数如下表所示(注:此表并非当前国家个人所得税缴纳标准表,且为简化逻辑个人所得税的计算方式也进行了一定修改)遍历集合并计算他们应缴纳的个人所得税(个人所得税为double类型,保留一位小数)。
2022-11-14 14:53:51 2370
原创 1221. 分割平衡字符串
解释:s 可以分割为 "RL"、"RRLL"、"RL"、"RL" ,每个子字符串中都包含相同数量的 'L' 和 'R'。注意:分割得到的每个字符串都必须是平衡字符串,且分割得到的平衡字符串是原平衡字符串的连续子串。在一个 平衡字符串 中,'L' 和 'R' 字符的数量是相同的。给你一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。返回可以通过分割得到的平衡字符串的 最大数量。总结:题目只需要简单的遍历然后判断条件即可。输入:s = "RLRRLLRLRL"
2022-11-14 14:48:50 137
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人