自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

谜底的博客

我迷恋的时光自天空倾倒

  • 博客(336)
  • 资源 (1)
  • 收藏
  • 关注

原创 堆排序-小顶堆

在这里解释下为什么求数组中第K大的数用小顶堆,我们知道小顶堆的堆顶是最小值,也就是说其余剩下的元素都比它大,那么维护一个堆中数量位k的小顶堆,堆顶正好就是第K大了。从小到大排序:小顶堆,堆顶最小,push的时候到叶子节点,pop的时候是根节点。

2024-08-05 08:47:43 93

原创 1219 黄金矿工

你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。首先这道题求的是最大的收益,那其实就很简单了,和岛屿问题、腐烂的橘子都是一个思路,dfs+回溯来解即可。输入:grid = [[0,6,0],[5,8,7],[0,9,0]]一种收集最多黄金的路线是:9 -> 8 -> 7。

2024-07-28 23:53:38 179

原创 208 实现Trie(前缀树)

boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true;Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);

2024-07-14 12:45:42 252

原创 hot100

使用前缀和+hash的思想,单独的前缀和会超时,前缀和的思路就是用一个数组来存每个位置之前的前缀和,注意一般是pre[i+1] = pre[i]+nums[i],然后默认pre[0]=0(看题目灵活变化,也可能是pre[i] = pre[i-1] + nums[i-1]),本题中用一个变量记也可以;考虑原地哈希的办法,具体思路是,在经过一系列的调整后,使得每个位置存对应这个位置的数,即nums[i] == i+1, 在i=0的时候代表第一个位置存1,若不相等,则返回i+1;(好神奇的思路,不好理解,背吧)

2024-07-13 20:17:28 877

原创 79 单词搜索

首先这道题是一个二维的数组进行回溯,而且返回结果只是判断true or false,那么完全就不需要之前题目那么复杂存路径,就用一个变量来判断是否存在即可,而且只要存在了,就直接一层层返回。输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”如果 word 存在于网格中,返回 true;单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。

2024-07-10 08:53:01 256

原创 207 课程表

先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi。在此基础上,不断的将入度为0的节点放到队列中消费掉,消费的时候看哪些节点的入度变成了0,则可以加入到队列中,直到处理完成。n = 6,先决条件表:[[3, 0], [3, 1], [4, 1], [4, 2], [5, 3], [5, 4]]例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1。

2024-07-06 21:03:27 345

原创 208 实现 Trie (前缀树)

Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。// 返回 False。// 返回 True。// 返回 True。// 返回 True。

2024-07-06 20:14:05 310

原创 994 腐烂的橘子

这道题用的是bfs的思想,注意下bfs的话,多数是用队列来进行处理。返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。输入:grid = [[2,1,1],[1,1,0],[0,1,1]]每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。值 2 代表腐烂的橘子。值 0 代表空单元格;值 1 代表新鲜橘子;

2024-07-06 19:40:18 204

原创 237 删除链表中的节点

解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9。链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。给你一个需要删除的节点 node。注意,删除节点并不是指从内存中删除它。有一个单链表的 head,我们想删除它其中的一个节点 node。输入:head = [4,5,1,9], node = 5。给定节点的值不应该存在于链表中。node 前面的所有值顺序相同。node 后面的所有值顺序相同。链表中的节点数应该减少 1。

2024-07-06 16:01:30 194

原创 整数反转-int

主要这道题给定的int而不是string,不是双指针解法,就是数学计算法。给定一个整数,求出反转后的数。

2024-07-05 07:44:24 251

原创 84 柱状图中最大的矩形

首先这道题整体的思路上分为:求出每个位置的最大矩形面积,然后整体选择最大的那个。在此基础上,要直到最近的下标,可以用单调栈来保存,然后将符合的结果分别放到left和right数组中进行保存。若栈中没有数据,那么left里面放-1,right里面放n。给定 n 个非负整数,用来表示柱状图中各个柱子的高度。输入:heights = [2,1,5,6,2,3]那么面积就是:h⋅(right−left−1)。求在该柱状图中,能够勾勒出来的矩形的最大面积。解释:最大的矩形为图中红色区域,面积为 10。

2024-07-04 08:11:16 181

原创 41 缺失的第一个整数

比如有[3,4,5,-1,1,255],nums[0] = 3 和nums[0]-1 = 2为下标的值(即nums[2] = 5)进行交换,遍历完成后就保证了:i+1位置存的就是nuns[i]的数,比如nums[0] = 1。首先遍历数组,要做的就是数组的每个位置中,存的是每个位置对应的数,不满足的就在对应的位置进行交换.给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。这道题正常的写法是用哈希,但是这道题要求原地,那就使用一种原地哈希的思路.输入:nums = [1,2,0]

2024-07-02 21:00:35 255

原创 49 字母异位词分组

输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

2024-06-28 08:40:15 226

原创 283 移动零

这种原地移动数组类的题目,一般都是双指针,但这道题要将0都移动到右边,这个操作直接进行的话,肯定会覆盖原值,那么就需要考虑从左到右进行处理。那么双指针的含义就如下:左边的指针是非0数组部分最右边的边界,右边的指针是为0数组最左边的边界,注意是不为0则进行交换。给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]

2024-06-25 08:48:21 186

原创 128 最长连续序列

这道题和之前的题目在理解上不同的是,这个求的是连续序列,不是子序列,而且根据示例,相当于排序后求子数组的长度。给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。这道题用的主要的思路是哈希表,简单来说就是每个数都判断一次这个数是不是连续序列的开头那个数。因此只需要对每个开头的数进行循环,直到这个序列不再连续,因此复杂度是O(n)。解释:最长数字连续序列是 [1, 2, 3, 4]。输入:nums = [100,4,200,1,3,2]

2024-06-25 08:21:48 175

原创 287 寻找重复数-类似于环形链表II

我们先设置慢指针 slow 和快指针 fast ,慢指针每次走一步,快指针每次走两步,根据「Floyd 判圈算法」两个指针在有环的情况下一定会相遇,此时我们再将 slow 放置起点 0,两个指针每次同时移动一步,相遇的点就是答案。给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。以数组 [1,3,4,2,2] 为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n)注意是环的入口而不是第一次的相遇点。

2024-06-23 18:18:30 364

原创 31 下一个排列

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]。例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。,这样才满足 “下一个排列” 的定义。输出:[1,3,2]

2024-06-23 15:32:53 264

原创 75 颜色分类

上面的代码主要涉及的地方其实就是等于2的时候,直接交换了并没有i++,其实是这样:最开始zero指向的元素可能并不是0,two指向的元素也并不是2,比如首次和2交换后,交换过去的元素可能012都有可能,那么如果直接i++的话就出错了;这道题,主要的思路是双指针,但是和之前的双指针意思不一样,这次因为数组中有三种元素,用zero指针和two指针分别代表0和2,然后剩下的中间的就是1.输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]

2024-06-23 14:50:35 145

原创 32 最长有效括号-求长度

需要注意的是,如果一开始栈为空,第一个字符为左括号的时候我们会将其放入栈中,这样就不满足提及的「最后一个没有被匹配的右括号的下标」,为了保持统一,我们在一开始的时候往栈中放入一个值为 −1 的元素。给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。解释:最长有效括号子串是 “()()”输入:s = “)()())”

2024-06-22 19:29:41 270

原创 763 划分字符区间

贪心的解法,首先题目中说了,同一个字母要出现在一个片段中,那么就要想到需要先遍历一遍字符串,得到每个字母的最后一个位置。像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。划分结果为 “ababcbaca”、“defegde”、“hijhklij”。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。返回一个表示每个字符串片段的长度的列表。

2024-06-21 09:03:18 216

原创 118 杨辉三角

输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。输入: numRows = 5。

2024-06-20 22:20:29 313

原创 leetcode45 跳跃游戏II

在遍历数组的时候,不必要访问数组的最后一个元素,因为题目保证了一定能跳到最后一个位置,那我们在访问最后一个元素的时候,我们的边界一定是大于等于最后一个元素。如果访问最后一个元素,在边界恰好为最后一个位置的情况下,会增加一次次数(解释的是下面代码中i < n-1的逻辑)。举个例子:2,3,1,1,4 这个数组,开始的时候2可以跳到3或1的位置,假如跳到3,则又可以直接跳到终点,只需要两步即可;从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。初始位置为 nums[0]。

2024-06-20 22:15:23 360

原创 leetcode238 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。定义 suf[i]表示从 nums[i+1]到 nums[n-1] 的乘积。定义 pre[i] 表示从 nums[0]到 nums[i−1] 的乘积。则有ans[i] = pre[i] * suf[i]输入: nums = [1,2,3,4]

2024-06-20 00:23:47 202

原创 leetcode189 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。输入: nums = [1,2,3,4,5,6,7], k = 3。主要的思路就是先整体反转,再反转前半部分,在反转后半部分。向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]输出: [5,6,7,1,2,3,4]

2024-06-19 23:56:48 285

原创 leetcode498 对角线遍历

本题目主要考察的就是模拟法,首先可以计算得出,对角线的个数为m+n-1,在此基础上对于对角线进行遍历(从0开始),则第偶数条为从左下到右上,第奇数条为从右上到左下,根据奇数偶数来确定走什么遍历逻辑。给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。输入:mat = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,4,7,5,3,6,8,9]

2024-06-18 23:20:30 274

原创 leetcode56 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输出:[[1,6],[8,10],[15,18]]

2024-06-18 09:01:02 348

原创 leetcode695 岛屿的最大面积

输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]计算并返回 grid 中最大的岛屿面积。

2024-06-14 09:01:43 426

原创 leetcode 200 岛屿数量

这道题要使用dfs法来进行遍历,在矩阵遍历的过程中,遇到为1的节点,则从该位置开始进行dfs,直到遇到边界;同时在dfs的过程中,需要将遍历到的1置为0,防止下一次又遍历到。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。输入:grid = [

2024-06-14 08:49:18 338 1

原创 leetcode73 矩阵置零

这道题题目上要求用原地算法,先说开辟额外辅助空间的方法吧,原理上就是对于行和列开辟两个布尔型数组,先遍历一遍矩阵,将为0的位置(行和列的下标)置为0,完事后再遍历一遍矩阵,把对应位置的值置为0即可。给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]另外还有不适用额外空间,只需要定义变量的写法,但感觉有点复杂了,先不写了。输出:[[1,0,1],[0,0,0],[1,0,1]]

2024-06-14 08:24:33 338

原创 leetcode240 搜索二维矩阵II

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5。这道题还是用的类似于二分的思想,但是也不是二分了,就是每次用来排除一整行或整列。编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。

2024-06-14 08:04:43 272

原创 leetcode 215 数组中的第K个最大元素

这题目一看就是让用堆来做,但目前对堆的实现原理还是理解的不深刻,就先使用go的heap包来进行实现。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。同时还需要注意的是,求最大值用小顶堆,求最小值用大顶堆。输入: [3,2,1,5,6,4], k = 2。

2024-06-05 09:03:43 329

原创 leetcode739 每日温度

这道题愣是去理解的话,还是有点费劲,建议根据上面的那个测试用例来进行debug,首先在从左到右的顺序遍历过程中,栈中存的下标用j来表示,就相当于遍历到i的时候(此时j小i大,那距离就是i-j),就相当于在第一次遍历到的某个位置的时候,此时还不知道后面谁比他大的,遍历到第一个比它大的时候才进行计算,添加到ans中。如果气温在这之后都不会升高,请在该位置用 0 来代替。输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]

2024-06-04 22:35:12 320

原创 leetcode394 字符串解码

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。给定一个经过编码的字符串,返回它解码后的字符串。输入:s = “3[a]2[bc]”输出:“aaabcbc”

2024-06-04 09:16:56 121

原创 leetcode155 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。--> 返回 -3.minStack.getMin();--> 返回 -2.minStack.top();

2024-06-04 08:37:39 252

原创 leetcode153 寻找旋转排序数组中的最小值

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]]。已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。输入:nums = [3,4,5,1,2]

2024-06-01 20:36:17 199

原创 leetcode33 搜索旋转排序数组

在传递给函数之前,nums 在预先未知的某个下标 k(0

2024-06-01 19:36:39 215

原创 leetcode74搜索二维矩阵

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3。给你一个整数 target ,如果 target 在矩阵中,返回 true;否则,返回 false。

2024-06-01 18:05:44 606

原创 leetcode35 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。在这个左闭右开写法的代码中,跳出循环的条件就是left =right,等于的时候,返回left或right都可以。找不到的情况下,返回大于target的第一个下标即可,也就是left。输入: nums = [1,3,5,6], target = 2。请必须使用时间复杂度为 O(log n) 的算法。

2024-05-29 09:28:18 276

原创 leetcode438 找到字符串中所有字母的异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。整体上来看,第二种方法比较符合认知中的滑动窗口,而第一种方法是和之前的题目解法相似,且只需要新开一个数组就可以。另外,第二道题如果不想每次-'a’的话,可以把数组的长度设置为128(ASCII的长度)起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

2024-05-29 08:42:28 208

原创 leetcode124 二叉树中的最大路径和-dfs

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。输入:root = [-10,9,20,null,null,15,7]给你一个二叉树的根节点 root ,返回其 最大路径和。路径和 是路径中各节点值的总和。

2024-05-23 08:32:28 388

设计模式总结.pdf

自己整理的关于设计模式的总结,有全部的设计模式介绍,以及常用的设计模式总结记忆,适合程序员面试前突击以及日常学习使用

2020-07-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除