笔试
文章平均质量分 88
今天也要好好加油呀
这个作者很懒,什么都没留下…
展开
-
DAY38补!||斐波那契数列,爬楼梯,使用最小花费爬楼梯
输入:cost = [1,100,1,1,1,100,1,1,100,1]F(n) = F(n - 1) + F(n - 2),其中 n > 1。解释:F(2) = F(1) + F(0) = 1 + 0 = 1。解释:F(3) = F(2) + F(1) = 1 + 1 = 2。解释:F(4) = F(3) + F(2) = 2 + 1 = 3。n阶台阶,还可以定义n+1长的数组,大不了dp[0]不赋值,为0嘛。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。解释:你将从下标为 1 的台阶开始。原创 2023-08-23 01:41:43 · 46 阅读 · 0 评论 -
DAY29!||递增子序列,全排列,全排列Ⅱ
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素。输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。原创 2023-08-10 16:31:20 · 54 阅读 · 0 评论 -
DAY28!||组合总和Ⅱ,子集,子集Ⅱ
加一个bool型数组used,用来记录同一树枝上的元素是否使用过,集合去重的重任就是used来完成的。“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。初次接触去重,有点不好理解,很多操作也不熟练,排序想复杂了,去重没有注意到树层与树枝的区别。输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]要去重的是同一树层上的“使用过”,同一树枝上的都是一个组合里的元素,不用去重。返回的解集中,子集可以按 任意顺序 排列。原创 2023-08-10 00:21:02 · 30 阅读 · 0 评论 -
DAY27!||分割回文串,复原IP地址
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。简单来说呢,就是切割专场,差不多了吧,主要是字符串截取方式没想到这么简单粗暴,需要复习一下字符串操作(不过字符串那个专题大部分都是双指针操作),然后日常判断不好终止条件。给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。输出:[[“a”,“a”,“b”],[“aa”,“b”]]原创 2023-08-08 22:31:36 · 34 阅读 · 0 评论 -
DAY25!||电话号码的字母组合,组合总和
先用字符串数组表把每个按键数字对应的字母列出来,然后index选取输入的第index位数字时,首先要转化成这个数字对应的字母字符串。因为输入的数字是string类型的,所以“ -‘0’ ”转化为真正的数字,再从数组表中找到对应的字母串。输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]注意 2 可以使用多次。2.每一个数字代表的是不同集合,也就是求不同集合之间的组合,注意for循环范围。输出: [[2,2,2,2],[2,3,3],[3,5]]原创 2023-08-07 16:33:40 · 35 阅读 · 0 评论 -
DAY24!!!||组合,组合总和
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。剪枝优化:如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。输出: [[1,2,6], [1,3,5], [2,3,4]]图中可以发现n相当于树的宽度,k相当于树的深度。原创 2023-08-07 13:20:50 · 43 阅读 · 0 评论 -
有效括号,删除相邻重复元素,(逆波兰表达式求值)
之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。总结来说,涉及重复查找的可以用哈希表,涉及删除添加元素的可以用链表(一般链表首先考虑虚拟头节点),涉及字符串匹配的要用KMP算法(虽然我还没学会),涉及消除类的,对称的或者相邻重复的用栈。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“原创 2023-07-23 00:23:11 · 47 阅读 · 1 评论 -
DAY18!|| 二叉树的所有路径,路径总和
回溯可隐藏在traversal(cur->left, count - cur->left->val)这里, 因为把count - cur->left->val 直接作为参数传进去,函数结束,count的数值没有改变。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。其实可以反过来,每一次减去根节点,如果最后和清空了,就说明路径和刚好,会少一个参数。传参也太多了吧hhh。原创 2023-07-31 16:52:32 · 46 阅读 · 1 评论 -
DAY17!||最大最小深度,平衡二叉树,左叶子之和
一开始不太理解左叶子节点的记录意思,我觉得现在可以理解为,若左节点不是叶子节点,就继续找左子树中的左叶子节点,若左节点是叶子节点,那也不存在后序左子树了。代码的逻辑其实是求的根节点的高度,根节点的高度就是二叉树的最大深度,所以一般通过后序求的根节点高度来求的二叉树最大深度。左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。2.不能直接对比左右节点的最小高度,否则会犯上述错误,一侧节点为空,另一侧节点有树,不能算最小高度。原创 2023-07-30 14:44:54 · 29 阅读 · 1 评论 -
DAY16!|| 二叉树的最大、最小深度,完全二叉树的节点
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。其实这些题用层序遍历就是套模板。原创 2023-07-28 00:14:12 · 37 阅读 · 1 评论 -
DAY15!||层序遍历,翻转二叉树,对称二叉树
今天其实做了好多道层序的题,九道吧,有两道不太会,一个是,N叉树,一个是指向右侧节点,明天总结吧,对称二叉树用层序试了一下,好像不行,两个vector好像不能直接比较。递归时不要忘了每层节点在结果中的输入,判断深度 depth 和二维向量的 size 关系,决定是再开一行还是直接输入。给你二叉树的根节点 root ,返回其节点值的 层序遍历。给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。行:sizeof(matrix[0]);列:matrix[0].size();原创 2023-07-27 01:03:47 · 78 阅读 · 1 评论 -
DAY14!||二叉树的前序,中序,后序
首先,传递参数,既然是 void 型不返回参数,那记录二叉树的数组就应该传递的是地址,因此不要忘记 vector& result中的地址符号。其实,每次遍历传递的是根节点的指针,因此结构体指针访问内容要用“->”。给你二叉树的根节点 root ,返回它节点值的 前序 遍历。结构体用点( . ),结构体指针用箭头( -> )。结构体用点( . ),结构体指针用箭头( -> )。也就是说点的左边必须为实体,箭头左边必须为指针。也就是说点的左边必须为实体,箭头左边必须为指针。1.指针中(.)和(->)的区别。原创 2023-07-25 23:00:05 · 56 阅读 · 0 评论 -
DAY13!|| 前k个高频元素,(滑动窗口最大值)
这里定义小顶堆时,由于是键值对,所以以pair形式定义,虽然排序的是value,但是要查找的是key,便于后续堆中元素读取。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。3).题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。输入: nums = [1,1,1,2,2,3], k = 2。2).k 的取值范围是 [1, 数组中不相同的元素的个数]原创 2023-07-24 22:11:35 · 42 阅读 · 0 评论 -
DAY10!!||用栈实现队列,用队列实现栈
链接:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true;原创 2023-07-22 01:59:11 · 36 阅读 · 1 评论 -
day 8! 反转字符串,替换空格,翻转字符串里的单词,左旋转字符串
链接:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。输入:s = [“h”,“e”,“l”,“l”,“o”]输出:[“o”,“l”,“l”,“e”,“h”]输入:s = [“H”,“a”,“n”,“n”,“a”,“h”]输出:[“h”,“a”,“n”,“n”,“a”,“H”]2).s[i] 都是 ASCII 码表中的可打印字符。原创 2023-07-19 16:19:05 · 114 阅读 · 0 评论 -
DAY7!||四数相加,赎金信,三数之和),(四数之和)
链接:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输出:2解释:输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]输出:1。原创 2023-07-18 22:49:02 · 94 阅读 · 1 评论 -
day6! ||有效的字母异位词,两个数组的交集,快乐数,两数之和
首次接触map,因为不要求有序,所以unorded_map就可以了,其实这道题也相当于反向思考了,每找一个数,先看能不能在搜寻历史中找到它的补集。题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。原创 2023-07-17 23:25:36 · 223 阅读 · 1 评论 -
DAY4! ||两两交换链表中的节点,删除链表倒数第n个节点,链表相交,(环形链表)
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。先计算两个链表的长度,由于相交后使用同一链表,可以认为是将尾部拉齐了,因此就相当于先移动长链表,然后长短链表指针一起移动,寻找交点。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。原创 2023-07-17 23:27:54 · 225 阅读 · 1 评论 -
DAY3! 移除链表元素,反转链表,设计链表(仍存疑)
因此新定义一个虚拟节点 pre 位于原头节点之前,使其为 NULL,令原头节点的 next 指针指向该 NULL 虚拟节点,就可以使其变为尾节点,再令 pre 和 cur 均向后移一位,去反转第二个节点为倒数第二节点,逐步实现新链表从后到前依次排序。但问题在于,对于头节点来说,无法找到上一个节点,因此为了执行的统一性,定义一个虚拟头节点。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点。输出:[1,2,3,4,5]原创 2023-07-14 23:09:10 · 687 阅读 · 1 评论 -
DAY 2!有序数组的平方,长度最小的子数组,螺旋矩阵
因为除了终止点不动右移起始点的情况外,最外侧循环也会更新终止点位置,可能存在移动起始点,新的子数组不包含前面的某一个较大的值后,子数组和不达要求,开始右移终止点,连续移动多位才达到要求,使新的子数组长度变长的情况。然后起始点开始移动,找到该终止点下最短的子数组,并与已有子数组长度比较,若比已有长度短,则更新子数组长度。自我实现时采用的是,给子数组长度初始赋一个循环中不可能出现的值,比如 num.length+1 ,如果最后验证子数组长度为这个,说明循环没改变长度值,没有子数组满足条件。原创 2023-07-13 22:05:31 · 840 阅读 · 0 评论 -
DAY 1!二分查找与快慢指针
利用vector特性,遍历数组,与val不等,则在数组后拷贝,与val相等,就积累次数v,最后返回长度为,数组原长度nums.length - 积累次数v,最后返回数组是添加了无val的长数组去掉前面原数组。自我实现没有成功,主要原因是边界判断不对,middle陷入了死循环,只有一个元素的时候,无限循环,且没有办法跳到判断数组中没有的元素的return -1。第一天刷了好久,应该有五六个小时,也只刷了基础,不过是从自我实现一步一步走的,希望后面能好转吧!1).你可以假设 nums 中的所有元素是不重复的。原创 2023-07-12 18:41:16 · 1062 阅读 · 0 评论