自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 334. 递增的三元子序列

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true;创建一个左数组left,left[i]表示下标[0,i]之间的最小值,右数组right,right[i]表示下标[i,r]之间的最大值,r表示数组最后一个下标。解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6。输入:nums = [2,1,5,0,4,6]

2023-10-30 17:35:40 168

原创 【无标题】

set.lower_bound(val),返回set中大于等于val(最接近val)元素的迭代器,如果set中值都小于val,则返回set.end()set的底层使用的是红黑树,查找的时间复杂度为O(logn),删除的时间复杂度为O(1),插入的时间复杂度为O(logn)输入:nums = [1,5,9,1,5,9], indexDiff = 2, valueDiff = 3。输入:nums = [1,2,3,1], indexDiff = 3, valueDiff = 0。否则,返回 false。

2023-10-30 14:56:19 147

原创 229. 多数元素 II

给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。输入:nums = [3,2,3]输入:nums = [1,2]输入:nums = [1]排序,遍历的同时计数。

2023-10-27 22:32:25 312

原创 274. H 指数

根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次。给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。

2023-10-27 22:08:51 439

原创 【二叉树】298. 二叉树最长连续序列

该路径,可以是从某个初始节点到树中任意节点,通过「父 - 子」关系连接而产生的任意路径。且必须从父节点到子节点,反过来是不可以的。给你一棵指定的二叉树的根节点 root ,请你计算其中 最长连续序列路径 的长度。输入:root = [1,null,3,2,4,null,null,null,5]解释:当中,最长连续序列是 2-3。注意,不是 3-2-1,所以返回 2。解释:当中,最长连续序列是 3-4-5 ,所以返回结果为 3。输入:root = [2,null,3,2,null,1]

2023-06-07 20:22:58 871 1

原创 【滑动窗口】1100. 长度为 K 的无重复字符子串

使用滑动窗口,创建unordered_set集合,右指针移动时,判断集合中是否存在当前右指针所指元素,如果存在,则滑动左指针直到不存在。这里有 6 个满足题意的子串,分别是:‘havef’,‘avefu’,‘vefun’,‘efuno’,‘etcod’,‘tcode’。否则,将当前右指针所指元素加入集合,如果滑动窗口长度为目标长度,则将该滑动窗口内的字符串加入结果集,同时将左指针右移一位。给你一个字符串 S,找出所有长度为 K 且不含重复字符的子串,请你返回全部满足要求的子串的 数目。

2023-06-06 20:32:25 624

原创 【滑动窗口】487. 最大连续1的个数 II

滑动窗口,右指针滑动遇到0时,计算如果当前右指针位置的0变成1,那么会最长连续1的长度是多少,即继续遍历直到遇到下一个0或者到达数组末尾。注意,这时候要用一个临时指针遍历,因为还要计算不改变0的长度。给定一个二进制数组 nums ,如果最多可以翻转一个 0 ,则返回数组中连续 1 的最大个数。解释:翻转第一个 0 可以得到最长的连续 1。输入:nums = [1,0,1,1,0,1]如果不改变当前0,则更新左指针到当前位置+1。输入:nums = [1,0,1,1,0]

2023-06-06 20:13:25 671

原创 【滑动窗口】159. 至多包含两个不同字符的最长子串

一旦当前遍历到的字符在滑动窗口中不存在且滑动窗口内的字符种类等于2时,移动左指针直到滑动窗口内的字符种类小于2,将当前字符加入滑动窗口。给你一个字符串 s ,请你找出 至多 包含 两个不同字符 的最长子串,并返回该子串的长度。遍历字符串,使用unordered_map记录当前窗口的字符种类及个数。解释:满足题目要求的子串是 “aabbb” ,长度为 5。解释:满足题目要求的子串是 “ece” ,长度为 3。输入:s = “ccaabbb”输入:s = “eceba”

2023-06-05 20:19:46 647

原创 1055. 形成字符串的最短路径

(例如,“ace” 是 “abcde” 的子序列,而 “aec” 不是)。当出现该轮循环没匹配到目标字符串中的字符时,说明目标字符串中存在源字符串没有的字符,说明无法通过源字符串构建目标字符串。解释:目标字符串 “abcbc” 可以由 “abc” 和 “bc” 形成,它们都是源字符串 “abc” 的子序列。解释:由于目标字符串中包含字符 “d”,所以无法由源字符串的子序列构建目标字符串。解释:目标字符串可以按如下方式构建: “xz” + “y” + “xz”。

2023-06-05 19:56:20 492

原创 【反转再反转】186. 反转字符串中的单词 II

输入:s = [“t”,“h”,“e”," “,“s”,“k”,“y”,” “,“i”,“s”,” “,“b”,“l”,“u”,“e”]输出:[“b”,“l”,“u”,“e”,” “,“i”,“s”,” “,“s”,“k”,“y”,” ",“t”,“h”,“e”]单词 的定义为:单词是一个由非空格字符组成的序列。s 中的单词将会由单个空格分隔。必须设计并实现 原地 解法来解决此问题,即不分配额外的空间。给你一个字符数组 s ,反转其中 单词 的顺序。先整体反转,反转后数组中所有单词都是倒序。

2023-06-01 21:34:00 499

原创 【排序】280. 摆动排序

给你一个的整数数组 nums, 将该数组重新排序后使 nums[0] = nums[2]

2023-06-01 20:55:34 731

原创 【最值次值】624. 数组列表中的最大距离

现在你需要从两个不同的数组中选择两个整数(每个数组选一个)并且计算它们的距离。一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1,同时从第二个数组中选择 5。如果最小值或者最大值不止一次,或者最小值下标与最大值下标不相同,直接返回最大值减最小值。在小数组a中找出最小值和次小值,以及最小值出现的次数和最小值下标。在大数组b中找出最大值和次大值,以及最大值出现的次数和最大值下标。分别提取出所有数组的最小值和最大值得到小数组a和大数组b。否则返回最大值减次小值与次大值减最小值之间的最大值。

2023-05-31 22:59:13 679

原创 面试题 16.16. 部分排序

给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。如果第一次出现当前遍历元素小于ma,说明出现逆序,更新右边界为当前位置,同时寻找当前元素应该处于哪个位置,即左边界,记录这个值。之后如果还出现逆序,判断逆序的数是否小于之前出现过的逆序数,如果小于的话要更新左边界,否则只更新右边界。输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]

2023-05-31 22:21:12 485

原创 【区间】剑指 Offer II 074. 合并区间

如果当前遍历的区间的左边界大于当前右边界,说明当前区间和前面区间不重叠,将前面区间放入结果集,同时更新左边界l为当前遍历的区间左边界,右边界r为当前遍历的区间的右边界。从下标1开始遍历区间,如果当前遍历的区间的左边界小于或等于当前右边界r,说明当前区间可以合并到前面,更新右边界r。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输出:[[1,6],[8,10],[15,18]]

2023-05-31 21:30:24 632

原创 【区间划分】763. 划分字母区间

如果当前遍历的字母在set中不存在,则将该字母插入set中,同时count加上当前字母片段外的个数即cnt[s[i]-‘a’] - 1,当前字母未遍历到的个数减1,即cnt[s[i]-‘a’] --.设置一个set集合记录当前片段的字母。像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。遍历字符串,如果count=0说明当前片段中的字母在片段外已经没有了,当前片段划分结束,set清空。如果当前片段中的字母在片段外已经没有了,说明该片段划分结束。

2023-05-31 21:08:18 933

原创 (动态规划,分治)leetcode53. 最大子数组和

采用动态规划的思路,dp[i]表示以下标i为右边界的子数组的最大值,dp[i]只跟dp[i-1]有关,如果dp[i-1] + nums[i] > nums[i]。那么dp[i]的最大值为dp[i-1]+nums[i],否则为nums[i].输入:nums = [-2,1,-3,4,-1,2,1,-5,4]解释:连续子数组 [4,-1,2,1] 的和最大,为 6。输入:nums = [5,4,-1,7,8]dp中的最大值即为最大连续子数组和。子数组 是数组中的一个连续部分。输入:nums = [1]

2023-05-12 17:32:04 601

原创 (dfs)leetcode200. 岛屿数量

遍历数组,遇到‘1’时(遇到岛屿,岛屿数量+1),采用深度优先搜索,按右下左上的顺序遍历完所有相连的‘1’,同时将其改为‘0’,防止二次遍历。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。时间复杂度为O(n^2),空间复杂度为O(n)此外,你可以假设该网格的四条边均被水包围。输入:grid = [输入:grid = [

2023-05-12 17:14:58 530

原创 (动态规划,回溯)leetcode22. 括号生成

以n = 3为例,5种括号组成可以分解为[”(" + “(())” +“)”, “(” + “()()” + “)”, “(” + “()” +“)” + “()”, “(” + “)” + “(())”, “(” + “)” + “()()”]因为l.size() 和r.size() 都小于n,所以如果我们知道了1~n-1个括号的所有组成,就可以遍历得到n个括号的所有组成。输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

2023-05-12 15:54:17 534

原创 (双指针)leetcode11. 盛最多水的容器

以两指针所在位置的垂线高度作为桶的边缘。考虑指针如何移动,可以知道的是,两指针所指的垂线高度低的移动,桶的面积才可能增大,移动高的只可能变小或不变。给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。所以,每次移动垂线高度比较低的指针,直到两指针相遇。返回容器可以储存的最大水量。时间复杂度为O(n)

2023-05-12 14:29:08 777

原创 [滑动窗口]leetcode3. 无重复字符的最长子串

使用滑动窗口,遍历字符串,如果当前字符在滑动窗口内不存在,则将其加入滑动窗口(即滑动窗口右边界扩一位)请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。如果当前字符在滑动窗口内存在,则滑动窗口左边界右移直到相同的字符不在窗口内。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。159. 至多包含两个不同字符的最长子串。

2023-04-28 11:24:41 846

原创 【栈和队列】剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )执行deleteHead时,删除出队栈的栈头元素,如果出队栈为空,则将入队栈的元素移入出队栈。如果入队栈也为空,返回-1。所有入栈出栈操作均根据栈规则。输出:[null,-1,null,null,5,2]输出:[null,null,3,-1,-1]设置两个栈,一个入队栈,一个出队栈。

2023-04-28 10:53:32 536

原创 (二叉树,层序遍历)leetcode662. 二叉树最大宽度

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。解释:最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7)。输入:root = [1,3,2,5,null,null,9,6,null,7]解释:最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9)。解释:最大宽度出现在树的第 2 层,宽度为 2 (3,2)。输入:root = [1,3,2,5,3,null,9]输入:root = [1,3,2,5]

2023-03-14 10:18:24 123

原创 (二叉树)leetcode114. 二叉树展开为链表

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null。输出:[1,null,2,null,3,null,4,null,5,null,6]如果左子树存在,将左子树放在右子树位置,右子树放在原左子树最右节点右侧。输入:root = [1,2,5,3,4,null,6]展开后的单链表应该与二叉树 先序遍历 顺序相同。时间复杂度O(n),空间复杂度O(1)依次遍历右子树,重复执行(1)操作。输入:root = [0]输入:root = []

2023-03-14 09:38:00 107

原创 (二叉树遍历)leetcode515. 在每个树行中找最大值

1.java队列知识,普通队列用LinkedList,优先队列使用PriorityQueue。给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。输入: root = [1,3,2,5,3,null,9]层序遍历,每次将队列一整层的节点取出,将其子节点放入队列中。时间复杂度为O(n),空间复杂度为O(n)输入: root = [1,2,3]取出节点的时候记录该层的最大值。输出: [1,3,9]

2023-03-13 09:07:43 143

原创 (栈)leetcode71. 简化路径

任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’。给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。如果遇到非”“和非”.“,则将当前字符串拼接在”/“之后入栈。此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…输入:path = “/a/./b/…输入:path = “/home//foo/”输入:path = “/home/”输出:“/home/foo”

2023-03-05 10:36:40 351

原创 (哈希)leetcode554. 砖墙

其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你的面前有一堵矩形的、由 n 行砖块组成的砖墙。每一行砖块的宽度之和相等。输入:wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]遍历哈希表,找到缝隙最多的位置,从该位置穿过去会穿过最少的砖。输入:wall = [[1],[1],[1]]

2023-03-04 09:49:59 279

原创 leetcode389. 找不同

设一个整型变量cnt,初始值为0.将字母映射到0-25,遍历字符串s和t,每次遍历,cnt减去s中字符对应的数字,加上t中字符对应的数字。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。输入:s = “abcd”, t = “abcde”最后cnt的值即为添加的字符对应的数字,映射回去。时间复杂度为O(n),空间复杂度为O(1)输入:s = “”, t = “y”解释:‘e’ 是那个被添加的字母。1.隐式转换赋值需要强转之后赋值。请找出在 t 中被添加的字母。

2023-03-03 09:02:43 226

原创 (哈希查找)leetcode290. 单词规律

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。输入: pattern = “abba”, s = “dog cat cat dog”输入:pattern = “abba”, s = “dog cat cat fish”输入: pattern = “aaaa”, s = “dog cat cat dog”给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。时间复杂度O(n),空间复杂度O(n)

2023-03-03 08:47:18 225

原创 (哈希查找)leetcode242. 有效的字母异位词

用一个长度为26的数组映射所有小写字母,遍历数组,字符串s中的字符映射的数组下标对应的值+1.字符串t中的字符映射的数组下标对应的值-1.注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。输入: s = “anagram”, t = “nagaram”输入: s = “rat”, t = “car”时间复杂度为O(n),空间复杂度O(n)最后判断数组值是否都为0.

2023-03-03 08:21:28 53

原创 (哈希查找)leetcode205. 同构字符串

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。输入:s = “paper”, t = “title”给定两个字符串 s 和 t ,判断它们是否是同构的。输入:s = “egg”, t = “add”输入:s = “foo”, t = “bar”时间复杂度为O(n),空间复杂度为O(n)如果发现1对多或者多对1则返回false。

2023-03-02 23:01:07 341

原创 (哈希查找)leetcode128. 最长连续序列

首先对数组去重,然后遍历去重后的数组,遍历元素为num时,查找数组中是否存在num+1, num+2…如果一直找到num+x,而num+x+1不存在时,则以num为起点的连续序列长度为x+1。都是属于以num-1为起点的序列的,没必要从num,num+1…所以,判断元素num是否可以作为起点,只要判断数组中是否存在num-1。解释:最长数字连续序列是 [1, 2, 3, 4]。输入:nums = [0,3,7,2,5,8,4,6,0,1]输入:nums = [100,4,200,1,3,2]

2023-03-02 09:43:46 133

原创 (哈希查找)leetcode49. 字母异位词分组

遍历map:采用迭代器map ::iterator it = map.begin();输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]遍历数组,将元素排序后作为map容器的key,vector作为map容器的value。查找key是否存在:map.find(key) == map.end()输出: [[“a”]]输出: [[“”]]

2023-03-02 09:13:27 101

原创 (二分查找)leetcode1539. 第 k 个缺失的正整数

考虑普遍情况,当缺失的数在数组中最大最小元素代表的区间范围内时,我们只要找到arr[i] - i - 1 >= k > arr[i-1] - i -1 -1的位置i,缺失的数肯定位于arr[i-1]和arr[i]之间。代表11前面缺失了6个数。解释:缺失的正整数包括 [1,5,6,8,9,10,12,13,…缺失的数为arr[i] - (arr[i] - i - 1 - k + 1) = i+k。输入:arr = [2,3,4,7,11], k = 5。输入:arr = [1,2,3,4], k = 2。

2023-03-01 10:13:37 96

原创 (二分查找)leetcode852. 山脉数组的峰顶索引

如果nums[mid] nums[mid+1]说明mid位于递减区,此时[mid+1,…arr[i - 1] < arr[i] > arr[i + 1] > …二分查找,根据nums[mid]和nums[mid+1]进行比较来判断mid处于下降区递增区还是递减区。输入:arr = [24,69,100,99,79,78,67,36,26,19]输入:arr = [0,2,1,0]输入:arr = [3,4,5,1]

2023-03-01 08:59:41 97

原创 (二分查找)leetcode162. 寻找峰值

易证,如果nums[i] > nums[i+1]那么[0…如果nums[i] < nums[i+1],那么[i…所以该问题具有二分性,如果是nums[mid]>nums[mid+1],那么丢弃[i+1…如果nums[mid]

2023-02-28 10:03:03 263

原创 (二分查找)leetcode153. 寻找旋转排序数组中的最小值

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]输入:nums = [4,5,6,7,0,1,2]输入:nums = [3,4,5,1,2]

2023-02-28 09:16:52 73

原创 (二分查找)278. 第一个错误的版本

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。输入:n = 5, bad = 4。输入:n = 1, bad = 1。所以,4 是第一个错误的版本。1.二分查找的边界控制。

2023-02-27 09:47:02 33

原创 (二分查找)leetcode74. 搜索二维矩阵

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。找到目标值所属的行,然后在该行采用二分查找。目标值所属的行也可以使用二分查找。将二维矩阵转为一维矩阵,然后采用二分法查找。每行的第一个整数大于前一行的最后一个整数。时间复杂度O(logm+logn)每行中的整数从左到右按升序排列。

2023-02-27 09:06:00 60

原创 (二分)leetcode69. x 的平方根

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5。解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。给你一个非负整数 x ,计算并返回 x 的 算术平方根。采用二分法找出平方最接近x并且小于x的数。时间复杂度为O(logn)

2023-02-24 09:31:30 60

原创 (双指针排序)leetcode922. 按奇偶排序数组 II

对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数;当 nums[i] 为偶数时, i 也是 偶数。给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数。分别找到值与下标奇偶性不对应的位置,两指针值互换。你可以返回 任何满足上述条件的数组作为答案。设置奇偶指针,初始值分别为1,0。时间复杂度为O(N)

2023-02-23 09:46:05 52

空空如也

空空如也

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

TA关注的人

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