一天三道题
文章平均质量分 55
力扣刷题记录
dreamlpx
这个作者很懒,什么都没留下…
展开
-
每天6道题之第31题:有效的井字游戏
前言解题思路及代码#include<iostream>#include<vector>#include<string>using namespace std;//分析题目// 因为所有的玩家轮流放棋,所以X的数量一定大于等于0的数量//获胜的玩家一定是自己在放棋后赢得比赛 一共有三种情况 // (1) 如果第一个玩家获胜,则X的数量大于0的数量// (2) 如果第二个玩家获胜,则X的数量等于0的数量// (3)游戏板上不可能同时出现3个X在一原创 2021-08-20 09:30:08 · 217 阅读 · 0 评论 -
每天6道题之第27题:翻转矩阵后的得分
前言解题思路及代码//思路://一个二进制数,只有最高位为1时才能取得最大值。//因此我们先翻转每行第一个元素为0的行,这样循环下来,第一列都为1//此时res = (1<<n-1)*m,这是第一列m个1的二进制和//接下来我们翻转剩余的n-1列,这里我们只要算出每列中0的个数和1的个数,得到cnt = max(0的个数,1的个数),则第j列cnt个1的二进制之和为(1<<(n-1-j))*cnt#include<iostream>#include原创 2021-08-18 14:36:21 · 132 阅读 · 0 评论 -
每天6道题之第七十一题:课程表(图)
前言这两天先不刷之前的题,先把18号要考试的题做一下。题目描述你必须选修 numCourse 门课程,记为 0 到 numCourse-1 。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?题目解析本题是一道经典的【拓扑排序】问题。首先,我们来了解一下什么是拓扑排序:在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。原创 2021-08-16 13:33:58 · 167 阅读 · 0 评论 -
每天6道题之第24题:去除重复字母
前言今天下午最后一道题,写完睡觉…题目描述给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。解题思路我们以示例1来想一想思路:示例 1:输入: “bcabc”输出: “abc”如果当前字母是b,好,先保存下来,然后是c,此时c的字典序在b后面,好,c也可以保存下来,后面又遇见了a,此时a的字典序比较靠前,那我们只有看a后面的元素中还有没有b或者c了,如果有,那就要删除前面的重复元素,因原创 2021-08-14 17:01:53 · 300 阅读 · 0 评论 -
每天6道题之第二十二题:救生艇(贪心算法+双指针)
前言题目描述第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为limit。 返回载到每一个人所需的最小船数。(保证每个人都能被船载)。解题思路如果最重的人和最轻的人可以共用一艘船,那么就这样安排,否则,最重的人无法与任何人配对,那么他们将自己独自乘坐一艘船。(1)令people[i]指向当前最轻的人,而people[j]指向最重的那位。(2)如果此时people[i]+people[j]<=li原创 2021-08-14 14:54:08 · 346 阅读 · 0 评论 -
每天6道题之第二十二题:买卖股票的最佳时机(贪心算法)
前言题目描述给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。解题思路这道题用贪心算法会比较简单,贪心算法是找出一个个局部最优解,那么通过这些局部最优解再得到全局最优解。我们注意到题目有这样一句话:你必须在再次购买前出售掉之前的股票,也就是说每原创 2021-08-14 14:24:29 · 188 阅读 · 0 评论 -
每天6道题之第二十一题:有序矩阵中的第k个最小数组和
待写…原创 2021-08-14 14:00:30 · 184 阅读 · 1 评论 -
每天6道题之第二十题:接雨水2(堆)
前言题目描述给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。呜呜呜 有一维的接雨水还不够,还来了一个二维的…解题思路看这个吧 把每一个元素称作块。因为那个图片给的好像瓷砖啊。其实做这题一开始都是想的是对于每一个块,去找它四个方向最高的高度中的最小值(二维下则是左右最高的高度取较小的那一个)作为上界,当前块作为下界但是这4个方向每次遍历复杂度过高,且不能像二维那样去提前预存每个方向的最大值那可以反过来我不以每个原创 2021-08-13 21:05:51 · 195 阅读 · 0 评论 -
每天6道题之第十九题:查找和最小的K对数字(堆)
前言题目描述给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk),按从小到大的顺序输出它们的和。解题思路其实我们要有一个先验知识,就是,遇见K问题的时候,要想到优先队列,包括大顶堆和小顶堆;回顾:像我们上一题中“前K个高频元素”,我们创建小顶堆,将前K个高频的元素都入堆,当新元素来临时,只要比较堆原创 2021-08-13 20:27:35 · 195 阅读 · 0 评论 -
每天6道题之第十八题:前K个高频元素(堆)
前言题目描述给定一个非空的整数数组,返回其中出现频度前K高的元素题目解析首先这道题很容易理解,就是说你要找到一种方法,来统计给定数组中出现的元素以及其出现的频度,然后返回前K个高频元素即可,如果频度相同那就返回元素值比较大的元素。解题思路(1)首先遍历整个数组,并使用哈希表记录每个数字出现的次数,并形成一个【出现次数数组】(2)找到原数组的前K个高频元素,就相当于找出【出现次数数组】的qianK大的值最简单的做法就是给【出现次数数组】排序,但由于可能给有N个不同的出现次数,所以总的算原创 2021-08-13 18:28:16 · 223 阅读 · 0 评论 -
每天6道题之第十七题:任务调度器(桶思想)
前言题目描述给定一个用字符数组表示的CPU需要执行的任务列表。其中包含使用大写的A-Z字母表示的26种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以再1个单位时间内执行完,CPU在任何一个单位时间内都可以执行一个任务,或者在待命状态。...原创 2021-08-13 11:37:31 · 268 阅读 · 0 评论 -
每天6道题之第十六题:和至少为K的最短子数组(队列)
前言题目描述返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。 如果没有和至少为 K 的非空子数组,返回 -1 。题目解析刚看到这道题的时候,我以为我读懂了,但其实并没有…我知道是会用到前缀和的,因为题目中有“连续子数组”,但是 我理所当然的认为是非要从头开始的连续子数组才算数,但其实不是,如果中间某一个子数组的和至少为K了,并且最短,那么肯定返回的是这个子数组的长度。所以现在要重新审视一下这个题目:用前缀和肯定没有毛病,举个例子吧:A=[17,85,93,-45,-2原创 2021-08-12 17:54:54 · 227 阅读 · 0 评论 -
每天6道题之第十五题:接雨水(栈)
前言题目描述题目解析接雨水这一题乍一看,没看懂,再看,噢!原来就是说如果某一点左右两边的最大值都比自己大那就说明能够接(不会流出来),但是接多少就需要我们计算了:接水量=左右两边的最大值中的最小值与当前值的差。而且要注意开头和结尾的接水量一定为0就按照这个思路就很好理解这道题,但是如何来做呢?解题思路(1)求出高度数组中每个元素的左边最大值,保存在一个数组里(2)求出高度数组中每个元素的右边最大值,保存在一个数组里(3)遍历高度数组,接水量=min(leftMax[i],rightM原创 2021-08-12 14:38:32 · 124 阅读 · 0 评论 -
每天6道题之第十四题:简化路径(栈)
前言题目描述以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…)表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs相对路径 请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 /结尾。此外,规范路径必须是表示绝对路径的最短字原创 2021-08-12 13:46:45 · 145 阅读 · 0 评论 -
每天6道题之第十三题:字符串解码(栈)
前言题目描述给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。题目解析思想:借助栈和上一题类似,知道了用栈之后就要去分情况考虑了首先考虑需原创 2021-08-10 23:36:15 · 300 阅读 · 0 评论 -
每天6道题之第十二题:反转每对括号间的字符串
前言本来没看懂题解的时候,我真的是欲哭无泪,一再感叹数据结构真难,但是会了之后发现,这也太简单了吧,而我也太聪明了吧!!!题目描述给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中不应 包含任何括号。题目解析像这种遇见括号的不用想 首先考虑用栈而且在写的时候一般都是要分三种情况讨论的(下面就本题来说)(1)遍历到左括号时:遇见左括号的时候,不用反转字母,所以只需要将当前已经遍历到的字符压进栈,原创 2021-08-10 22:07:33 · 1119 阅读 · 0 评论 -
每天六道题之第十一题:使括号有效的最少添加(栈)
题目描述给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(’ 或是‘)’,可以在任何位置),以使得到的括号字符串有效。 从形式上讲,只有满足下面几点之一,括号字符串才是有效的: 它是一个空字符串,或者它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者 它可以被写作 (A),其中 A 是有效字符串。给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。解题思路这一题比较简单,直接借用栈就可以解决,也就是让字符串中的字原创 2021-08-09 19:38:20 · 237 阅读 · 0 评论 -
每天6道题之第十题:K个一组翻转链表(8月10号复习)
题目描述给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k的整数倍,那么请将最后剩余的节点保持原有顺序。题目解析题目要求在一个链表中以k个链表结点为单位进行反转,什么意思呢?你可以想象把一个很长的链表分成很多个小链表,每一份的长度都是k最后一份的长度如果小于k则不需要反转,然后对每个小链表进行反转,最后将所有反转后的小链表按照之前的顺序拼接在一起解题思路参考这位大佬的博客:大佬解题思路首先,此题是分段转载 2021-08-09 17:56:52 · 92 阅读 · 0 评论 -
每天6道题之第九道题:从链表中删去总和为零的连续节点
题目描述给你一个链表的头节点 head,请你编写代码,反复删去链表中由总和值为 0的连续节点组成的序列,直到不存在这样的序列为止。如果存在多个总和值为0的连续节点序列,优先删除位置靠前的序列。删除完毕后,请你返回最终结果链表的头节点。解题思路:(1)借助三个指针和一个标志flag:一个指针dummy作为哑巴结点:dummy->next=head;不动。一个指针cur首先指向哑巴结点,用来遍历整个链表,cur=dummy,另一个指针nextTemp指向cur的下一个结点,同时在每遍历一次原创 2021-08-09 15:33:55 · 176 阅读 · 0 评论 -
每天6道题之第八题:链表中的下一个更大节点
题目描述:给出一个单向链表。链表中的节点分别编号为:node_1, node_2, node_3, … 。 每个节点都可能有下一个更大值(nextlarger value):对于 node_i,如果其 next_larger(node_i) 是 node_j.val,那么就有 j >i 且 node_j.val > node_i.val,而 j 是可能的选项中最小的那个。如果不存在这样的 j,那么下一个更大值为 0 。示例 2: 输入:[2,7,4,3,5] 输出:[7,0,5,5,原创 2021-08-09 14:24:37 · 190 阅读 · 1 评论 -
每天6道题之第七题:两两交换链表中的节点
昨天痛经休息了一天,今天满血复活!题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。解题思路:(1)申请一个新的结点作为哑巴头结点(2)然后给哑巴头结点赋值为cur,遍历cur做内循环,内循环的条件就是当前结点后面有一个以上结点(3)内循环要做的事是先将当前结点的next指向结点2,然后将结点2的next指向结点1,结点1的next指向结点3(4)此时将cur指针向前移动,继续上述操作ListNode *swap原创 2021-08-09 10:41:35 · 132 阅读 · 0 评论 -
一天六道题之第六题:奇偶链表(8月8日早上补8月7日任务)
题目描述:题目解读:要求对链表只能遍历一次,那么自然而然我们会想到奇偶指针。先写主函数:int main(){ ListNode *head=createByTail(); head=Solution().oddEvenList(head); displayLink(head); return 0;}所以我们只需要写出oddEvenList(head)函数就行,来看看怎么写,也就是我们的解题思路是怎么样的.ListNode *oddEvenList(ListNOde *head){原创 2021-08-08 10:42:19 · 83 阅读 · 0 评论 -
每天6道题之第五题:分隔链表(8月10号再复习)
题目描述:题目分析解读:通过分析我们知道:(1)如果k大于链表的长度len,那么返回的数组的前len项的每个链表都只有一个结点,后面的len+1~k项元素都是NULL;(2)如果k小于链表的长度len,那么返回的数组可以分为k个部分,其中前(len%k)项每个数组元素的链表中的结点数为(len/k +1),后面部分的每个数组元素中的链表的结点个数为(len/k)个。在解这道题的时候,由于本科期间代码能力的缺乏导致很多代码不会写,甚至百度出来解题答案也看不懂,感谢宁同学的悉心指导,总算是明白了。原创 2021-08-07 22:57:19 · 85 阅读 · 0 评论 -
一天6道题之第四题:链表组件
题目描述:题目解读:如果当前结点在列表G中,并且下一个结点不在列表G中,我们就找到了一个组件,就将res+1所以这一道题其实是很简单的,首先写主函数:int main(){ ListNode *head=createByTail(); vector<int> G; int m,data,res; cin>>m; for(int i=0;i<m;i++){ cin>>data; G.push_back(data); } res=Solu原创 2021-08-07 20:09:58 · 105 阅读 · 0 评论 -
一天6道题之第三题:排序链表
题目描述:明确解题思路:采用归并排序的方法。(1)先找到链表的中间结点,将链表分为两部分(2)对两部分进行递归排序 (其实用递归排序的话空间的复杂度就变成了O(n)了,但这里我还是用了递归,没有用快速排序)具体的归并排序可以参看这篇博客归并排序详细介绍首先来了解一下归并排序:归并排序图解归并排序最大的特点就是分治法,也就是先找到中间位置,然后将其拆为两部分,在这里是有一个递归的概念的,也就是说将一个链表不断的分为两部分(最开始的两部分为记为list1,list2),我们再分别对list1和l原创 2021-08-07 16:55:20 · 90 阅读 · 0 评论 -
一天6道题之第二题:旋转链表
题目描述:解题思路:(1)遍历链表求长度len,因为k可能大于len(2)将整个链表形成一个环(3)然后遍历链表,走到len-k处断开链表返回即可首先写主函数:int main(){ int k; cin>>k; ListNode *head=createByTail(); head=Solution().rotateRight(head); DisplayLink(head); return 0}题目要求用不带头结点的链表,所以依旧沿用第一题的createbyT原创 2021-08-07 14:15:53 · 99 阅读 · 0 评论 -
从2021年8月7日开始一天6道题之第一题:重排链表
前言:为了更好的自我监督,为了锻炼自己的代码能力,开始刷题,一共100道题,一天6道题,假期还剩下20天,还可以练完。上午两道题 下午两道题 晚上两道题。题目描述:重排链表 算法思路:(1)首先找到链表的中间结点(2)对链表的后半部分进行逆序反转(3)把链表的前半部分子链表与逆序后的后半部分子链表进行合并,合并的思路为:分别从两个 链表各取一个结点进行合并main函数:int main(){ListNode *head=createByTail();Solution().reo原创 2021-08-07 12:20:06 · 105 阅读 · 0 评论