
leetcode
FrostMonarch
这个作者很懒,什么都没留下…
展开
-
leetcode 128 最长连续序列(hash)
128. 最长连续序列难度困难437给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为O(n)。示例:输入:[100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。解题思路:我们首先走一遍数列,打一个hash,知道有什么数后,我们就遍历数列,然后尝试从这个点左右延伸,延伸的长度范围内的数字我们下次都可以不用走,可以证明这样我们每个数字最多遍历2次。至于延伸的时候我们需要判断数字在不在数..原创 2020-06-23 09:41:01 · 273 阅读 · 0 评论 -
O(1)空间复杂度找到相交链表的交点
相交链表编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。解题思路:首先将一条链首尾连起来,这时候就变成了找环的入口点的问题。我们可以用快慢指针先判断有没有环,然后再用快慢指针的交点poi开始和链表头开始找,找到的交点即为环的入口点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *..原创 2020-06-22 16:26:25 · 315 阅读 · 0 评论 -
剑指 Offer 56 - II. 数组中数字出现的次数 II(状态转移 位运算)
剑指 Offer 56 - II. 数组中数字出现的次数 II难度中等38在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4示例 2:输入:nums = [9,1,7,9,7,9,7]输出:1解题思路:我们可以发现,最后的数字假如第i位是1(二进制表示),那么第i位肯定有3*x+1个1,那么我们就思考第i位能不能进行转台转移。最终转...原创 2020-06-21 19:19:07 · 302 阅读 · 0 评论 -
剑指offer 数组中的逆序对(归并排序)
剑指 Offer 51. 数组中的逆序对难度困难176在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5解题思路:统计逆序对时候,答案的贡献以左半部分为基准。class Solution {public: vector<int> arrmv; int ans; void merge_sort(int l,int .原创 2020-06-20 16:12:01 · 183 阅读 · 0 评论 -
leetcode 42 接雨水(单调栈)
42. 接雨水难度困难1369给定n个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。感谢 Marcos贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6解题思路:我们希望找到每根柱子从左往右所做的贡献,很显然,当我们在第i根柱子向右拓展找到第1根比第i根...原创 2020-06-20 11:38:38 · 204 阅读 · 0 评论 -
剑指offer面试题38. 字符串的排列(回溯)
面试题38. 字符串的排列难度中等48输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]限制:1 <= s 的长度 <= 8解题思路:假如这里全是不同的字母,我们可以用简单的打标记回溯的方法来解决,但是这里会有重复的字母,这就需要我们先对字符串进行排序,本次回溯选择的时候 ...原创 2020-06-17 21:34:11 · 224 阅读 · 0 评论 -
leetcode 437路径总和(前缀和,hash,复杂度O(n)做法)
437. 路径总和 III难度简单424给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3原创 2020-06-06 20:24:55 · 905 阅读 · 0 评论 -
leetcode 338. 比特位计数(dp)
338. 比特位计数难度中等318给定一个非负整数num。对于0 ≤ i ≤ num范围中的每个数字i,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例2:输入: 5输出: [0,1,1,2,1,2]进阶:给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗? 要求算法的空间复杂度为O(n)。 你能进一步完善解法吗?要求在C++或任何其他语...原创 2020-06-05 11:51:23 · 156 阅读 · 0 评论 -
leetcode 312 戳气球(区间dp)
312. 戳气球难度困难297有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中。现在要求你戳破所有的气球。每当你戳破一个气球i时,你可以获得nums[left] * nums[i] * nums[right]个硬币。这里的left和right代表和i相邻的两个气球的序号。注意当你戳破了气球i后,气球left和气球right就变成了相邻的气球。求所能获得硬币的最大数量。说明:你可以假设nums[-1] =...原创 2020-06-04 22:45:20 · 274 阅读 · 0 评论 -
leetcode 309. 最佳买卖股票时机含冷冻期(DP)
给定一个整数数组,其中第i个元素代表了第i天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]解题思路:假设DP状态为dp[n][sta]表示走到第n天 sta==1 表...原创 2020-06-03 17:50:14 · 205 阅读 · 0 评论 -
leetcode 287. 寻找重复数(构造,二分)
给定一个包含n + 1 个整数的数组nums,其数字都在 1 到 n之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次。解题思路:我们建立一个数组cnt[i],表示数组中小...原创 2020-06-03 11:02:07 · 193 阅读 · 0 评论 -
leetcode 283. 移动零(思维)
题目大意:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。解题思路:我们需要维护一个变量是 在我们遍历的过程中出现的第一个0的位置lsz,然后每次交换lsz和当前遍历的元素,假如当前遍历的元素不为0.class Solution {public: void moveZeroes(vect原创 2020-06-01 21:42:16 · 164 阅读 · 0 评论 -
leetcode 238. 除自身以外数组的乘积(前缀乘积,思维)
题目大意:给你一个长度为n的整数数组nums,其中n > 1,返回输出数组output,其中 output[i]等于nums中除nums[i]之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间...原创 2020-06-01 16:24:28 · 236 阅读 · 0 评论 -
leetcode 146. LRU缓存机制(双向链表 + hash)
题目大意:运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶...原创 2020-05-30 18:54:49 · 189 阅读 · 0 评论 -
leetcode 155. 最小栈(辅助栈)
题目大意:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop()—— 删除栈顶的元素。top()—— 获取栈顶元素。getMin() —— 检索栈中的最小元素。解题思路:一个栈sta1是用来模拟栈操作的。另一个 栈sta2用来返回最小值,每次push的值比sta2.top()要下就push进去否则push sta2.top(),这样的好处是我们的sta2维护了每个最值的适用域。class M..原创 2020-05-29 15:19:56 · 263 阅读 · 0 评论 -
leetcode 139. 单词拆分(BFS 或者 DP)
题目大意:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。示例 2:输入: s = "applepenapple",.原创 2020-05-27 09:53:08 · 312 阅读 · 0 评论 -
leetcode 128. 最长连续序列 (hash,暴力)
题目大意:给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为O(n)。解题思路:我们每次枚举数字的第一个,然后往后数有多少个。可以证明每个数字只会被枚举一次。注意,中间用hash。class Solution {public: unordered_set<int> ms; int longestConsecutive(vector<int>& nums) { int ans = 0; .原创 2020-05-25 19:45:09 · 205 阅读 · 0 评论 -
leetcode 买卖股票的最佳时机 IV (DP)
题目大意:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。解题思路:首先,我们列出简单的DP的方法:假设dp[n][k]代表第n天还有k次交易额可以用。那么状态转移为:dp[n][k] = dp[n-1][k] //代表我们不用这次交易名额if(k){ //代表我们使用这次的交易名额for (i = 1;i<...原创 2020-05-25 17:25:04 · 174 阅读 · 0 评论 -
非递归方式实现二叉树的中序遍历
这里的关键点是维护一个栈,栈中的元素是仍未访问右节点的节点,每次我们不断地往左走的时候,就不断地压栈就可以了,模拟dfs的过程。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} *原创 2020-05-18 09:24:35 · 322 阅读 · 0 评论 -
leetcode 最小覆盖子串(双指针)
76. 最小覆盖子串给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"说明:如果 S 中不存这样的子串,则返回空字符串""。 如果 S 中存在这样的子串,我们保证它是唯一的答案解题思路:这题可以使用双指针解决,有点类似于找最长公共串。我们可以用左指针lf,右指针rg。我们不断拓展右指针,直到[lf,rg]的串满足要求,我们认为可以用lf指针.原创 2020-05-10 10:40:23 · 280 阅读 · 0 评论 -
leetcode 1425. 带限制的子序列和(单调队列 DP)
题目大意:从一个数列a中抽出子数列,这个子数列的元素的原来的下标之间的间距小于k,现在问我们应该怎么抽出子数列使得抽出的数列的和最大。解题思路:很明显的,我们设置dp[i]为我们在a中抽出这个元素后,在[0,i]位置产生的最大子序列和。那么转移为:其中range_max(i)表示我们在[i-k+1,i]中的最大子序列和。这句话的意思就是:我可以就此不继续生成子序列,或者我们想生成的...原创 2020-05-01 22:46:19 · 352 阅读 · 0 评论 -
leetcode 33. 搜索旋转排序数组 (二分)
题目大意:有一个数列从[1,i] 单调递增,a[i+1]<a[1],然后[i+1,n]单调递增,现在问我们能不能以log的复杂度找到数列中是否存在某个数。解题思路:很显然,我们需要先找出i+1的坐标,然后使用两次lower_bound。那么我们怎么找到i+1的下标呢?这里有点像零点定理,每次我们找到中点m,假如中点的值大于a[1]的值,证明i+1在m的右边,否则i+1在m的右边,...原创 2020-04-23 11:35:50 · 233 阅读 · 0 评论 -
leetcode 最少跳跃次数(BFS,剪枝)
题目大意:已知an,从i出发的话,每次我们可以选择走去min(n,i+ a[i]),或者[0,i-1],现在问我们最少几步可以走到n.n<=1e6解题思路:无权最短路,优先考虑BFS,但是我们每次假如按照题意每次都往前走的话会超时复杂度n^2,那么我们可以怎么改进呢?我们发现,从i位置出发,下次走的时候枚举的起点不必要从0开始到i-1,假如之前我们已经在u点往前跳过了,那么...原创 2020-04-18 18:28:51 · 569 阅读 · 0 评论 -
5195. 最长快乐字符串 (贪心)
题目大意:现在我们有a个'a', b个'b' , c个'c'. 问我们怎么组合这些字符使得这个字符串尽可能长,而且不存在连续3个相同的字符。找出这个字符串。a,b,c<=100解题思路:因为a,b,c<= 100 其实是可以用dp来做的。不过需要用dp来打印路径。先讲一下dp怎么做吧。其实就是无脑5维dp即可。dp[a][b][c][d][e]. 表示 当前我们还有...原创 2020-04-05 14:57:44 · 307 阅读 · 0 评论 -
leetcode 5379. 石子游戏 III(后缀和 , DP)
题目大意:alice和bob玩游戏,现在有n张牌,alice首先开始选牌,他可以选择1,2或者3张。之后bob也可以选择1,2或者3张。现在问我们alice和bob在最优的情况下,谁收集的牌的分数最大。解题思路:很显然,我们这里需要用DP来转移。每次轮到一位玩家的时候可以选择1,2,3张。令dp[n]表示抽到第n张牌的时候,玩家的最高得分,那么这里,我们得到上面分别表示我们拿取...原创 2020-04-05 14:49:41 · 288 阅读 · 0 评论 -
leetcode 5337 每个元音包含偶数次的最长子字符串(状压,搜索)
题目大意:有字符串str,我们抽取连续字串,规定连续字串的a,e,i,o,u出现的次数必须是偶数次(可以是0次),问我们最长可以截取多长这个字符串。length(str)<=1e5解题思路:这题我们需要先对状态进行编码,元音字母分别对应bitset的0到4位,每次遇到元音字母,我们就在相对应的位置取反。当我们遇到两个相同的状态时,这两个状态的位置相减就是合法的字符串,要使得这...原创 2020-03-08 18:24:52 · 286 阅读 · 0 评论 -
leetcode 5353 灯泡开关(规律)
题目大意:已知有n个灯泡。每个灯泡有off,on和变蓝三个状态。on灯泡要变蓝的充要条件是:所有on的灯泡必须从左到右排列。已知刚开始所有的灯泡都是off,给定一个按照时间变化的亮灯的序列,问我们总共有哪几个时刻所有on的灯泡是蓝的。解题思路:用数组记录每个灯泡on着的话,最左和最右可以延伸到哪里。然后询问当前灯泡on是否能够延续到0,另外询问是否有灯泡比它最右的灯泡还要远。其中最...原创 2020-03-08 18:16:05 · 446 阅读 · 0 评论 -
leetcode 5345 通过投票对团队排名(sort cmp关键字)
题目大意:已知有n个人开始投票,每个人选出心目中的1,2,3..m等奖。 m<=26。现在规定所有人的排名这样决定:任意A,B两个人,i从1到m开始枚举,若第i等奖中有任意一个人的票数较多,则那个人获得第i等奖,若一样多则i+1下一位开始比较。若到最后一等奖都是一样,则按字母序排。解题思路:额,很明显是一道stl的sort排序题,但是我们需要抽象出比较关键字cmp,直接模拟就...原创 2020-03-01 16:39:26 · 322 阅读 · 0 评论 -
leetcode 5172 形成三的最大倍数 (DP 贪心 DP路径打印)
题目描述:有一串数An,选出其中的子串,子串的和必须是3的倍数,且子串经过排列成为一个数字后,必须是所有可能的子串中最大的。比如[ 1,2,3,4,5]我们直接选出54321级符合要求,3不是最大的。稍稍吐槽一下,这道题是cf的原题。以前在cf上做用的贪心,刷刷刷就出来了,但是在这里惯性思维用了DP做。其实DP也没问题,关键这里的难点是需要打印最大的串。解题思路:我们令dp[p...原创 2020-02-23 19:46:03 · 383 阅读 · 0 评论 -
leetcode 1278 分割回文串 III (区间DP)
题目大意:有一个字符串,我们可以对其任意字符作变更。现在我们想把字符串切成k个回文串,问我们最少需要换多少个字符。解题思路:这种区间切割问题,应该需要联想到区间DP,考虑设立状态dp[l][k]表示起始点为l时候还需要划分k个字符时我们需要替换的最少字符数。可以写出伪代码:for i l->n-1: dp[l][k]=min(dp[l][k],cost[l][i]+...原创 2019-12-05 20:48:35 · 328 阅读 · 0 评论 -
leetcode 1218 Longest Arithmetic Subsequence of Given Difference(DP, 递增子序列)
题目大意:找出一串序列中的最长等差序列解题思路:首先这道题是一道DP题,我们很容易联想到最长递增子序列的题,里面有nlogn和n^2的解法。显然nlogn的方法无法往这里迁移,因为里面用的是lower_bound而不是具有等差序列性质的。在这里我们可以修改n^2的解法来达到nlogn复杂度。在n^2算法里面,我们需要往前面扫描,找到比当前小的元素且lis需要最大,这使我们必须完整的扫完...原创 2019-11-28 16:56:07 · 245 阅读 · 0 评论 -
leetcode 1263 Minimum Moves to Move a Box to Their Target Location (双向队列 BFS)
题意:在推箱子游戏中,怎么求人物为了把箱子推到终点所需要的推箱子次数最少的次数。解题思路:这题的题目数据非常小,考虑用暴力搜索的方法。很自然地我们可以建立状态其中pr,pc代表玩家的位置;br,bc代表箱子的位置。用flag表示走过的位置不能再走。一开始我想直接用dfs搜是不是就可以呢?后来发现,dfs走的路径不代表就是最优路径。无权图的最短路难道不是BFS。接着再用B...原创 2019-11-22 22:43:19 · 406 阅读 · 0 评论 -
leetcode 1248 优美子数组(滑窗)
题目大意:有一串数an,an由0和1组成,问我们包含k个1的连续子数组的个数是多少?解题思路:一开始想用前缀和,发现不会用。后来发现其实只要把1的位置拿下来然后对这个数组做一个滑窗就可以得到结果。废话:这里我们留意一下双指针的公式,因为双指针非常常用,例如这里的滑窗,所以我们为了快速从已知两个指针的位置和两个指针指向的位置长度中的两者推出剩下一个,我们有必要背一下以下公式:...原创 2019-11-14 18:53:22 · 228 阅读 · 0 评论