
leetcode(一刷)
文章平均质量分 83
跟着代码随想录系统进行的一刷
SuperSwaggySUP
研0 学习深度学习中
展开
-
Day46代码随想录(1刷) 多重背包+动态规划
思路:这题有环路所以判断就会变得麻烦所以我们可以拆成两个非环路进行比大小,对nums[0]进行讨论是否取,如果取则只能从[2,n-1)中讨论偷不偷,如果不取从[1,n)中讨论,所以最后只要比较两个环路的大小就ok了。偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。原创 2024-04-20 13:04:27 · 1254 阅读 · 0 评论 -
Day43 代码随想录(1刷) 完全背包
给你一个由整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合 32 位整数范围。7所有可能的组合为:(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。0状态:不知道怎么求排列数,求了组合数思路:求组合数就是先遍历物品再遍历背包,求排列数就是先遍历背包再遍历物品。原创 2024-04-19 16:41:49 · 1452 阅读 · 0 评论 -
Day42代码随想录(1刷) 动态规划
给你一个二进制字符串数组strs和两个整数m和n。请你找出并返回strs的最大子集的长度,该子集中有m个0和n个1。如果x的所有元素也是y的元素,集合x是集合y的。4最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3。2。原创 2024-04-18 16:59:22 · 838 阅读 · 0 评论 -
Day41代码随想录(1刷) 动态规划
1049. 最后一块石头的重量 II有一堆石头,用整数数组stones 表示。其中stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x 和y,且x <= y。那么粉碎的可能结果如下:如果x == y,那么两块石头都会被完全粉碎;如果x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回原创 2024-04-15 17:30:37 · 956 阅读 · 0 评论 -
Day38 代码随想录(1刷)动态规划
给定一个正整数n,将其拆分为k个的和(k >= 2),并使这些整数的乘积最大化。返回你可以获得的最大乘积。n = 21n = 1036状态:完成思路:这题一开始我就知道这个数学方法就是能分成多少个3就是最大的,如果剩4则最后一个乘4是最大的。动态规划方法,dp数组表示在i时拆开的最大值dp[i],所以dp[i]=Math.max(Math.max(dp[i-j]*(j),j*(i-j)),dp[i]);然后最后返回最后一个即可。原创 2024-04-12 19:51:48 · 562 阅读 · 0 评论 -
Day39 代码随想录(1刷) 动态规划 0-1背包
思路:这是一个存粹的0-1背包的入门问题,先用二维的dp数组解决,dp[i][j]表示背包最大容量为j的时候从物品【0-i】任取,所以最后一个格就是背包容量是N时的最大价值,状态转移方程也是很好理解的dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-weights[i]]+values[i]),意思就是对比不取物品i时在这个容量时的最大价值和取这个物品在背包容量允许的情况下的价值。第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。原创 2024-04-13 17:02:41 · 894 阅读 · 0 评论 -
Day37代码随想录(1刷) 动态规划
(通常用F(n)表示)形成的序列称为。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(n) = F(n - 1) + F(n - 2),其中 n > 1给定n,请计算F(n)。n = 21n = 32n = 43状态:完成思路:由题目意思可得,状态转移方程是dp[i]=dp[i-1]+dp[i-2]。原创 2024-04-11 12:55:23 · 1217 阅读 · 0 评论 -
Day36代码随想录(1刷) 贪心
思路:贪心思路就是如果前面的数比后面的数字大则把前面的数字减1然后把后面的数字变成9,这样子就可以了,但还有一个问题需要去注意的,就是遍历的顺序问题,如果采用从前到后则会导致值变小导致不符合要求,所以这题采用从后向前,但是从后向前还有一个需要注意的就是什么时候置9,要等所有结束遍历之后再置9,如果在循环中置9会导致有些值赋不上9,比如n=1000时就不行了,要等循环结束之后然后把flag以及后面都置为9。感想:今天完成贪心的所有内容,明天开始动态规划,keep going on。的最大数字,且数字呈。原创 2024-04-10 15:26:11 · 486 阅读 · 0 评论 -
Day34代码随想录(1刷) 贪心
这题把身高从小到大排,因为先排身高大的人所以无论他放在哪里都是符合的,又因为后面的数字排列时,前面的数字一定比他的大,所以后面的数字在排列时也是符合的。感想:今天时间比较挤,写的时间少了很多,主要是服务器的迁移,差点搞成大错,mysql5.7跟8.0的数据存储方式不一样,不能直接复制数据库的文件,幸好有回收站,linux就寄了幸好windows。编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。原创 2024-04-08 20:48:52 · 1340 阅读 · 0 评论 -
Day35代码随想录(1刷)贪心
给定一个区间的集合intervals,其中。返回需要移除区间的最小数量,使剩余区间互不重叠。1移除 [1,3] 后,剩下的区间没有重叠。2你需要移除两个 [1,2] 来使剩下的区间没有重叠。0你不需要移除任何区间,因为它们已经是无重叠的了。状态:没做出来,没想明白最少次数是什么意思思路:只要有重叠的肯定要有元素是被移除的,所以这题的解法就是求出所有的重叠区间出来就可以完成题目。原创 2024-04-09 19:56:42 · 1172 阅读 · 0 评论 -
Day32代码随想录(1刷) 贪心
给你一个整数数组nums和一个整数kinums[i]-nums[i]重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数组。5选择下标 1 ,nums 变为 [4,-2,3]。6选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2]。13选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4]。状态:完成思路:我这个有点偷鸡摸狗了,如果数据量多一点肯定超时了。原创 2024-04-06 13:01:19 · 1237 阅读 · 0 评论 -
Day30 代码随想录(1刷) 贪心
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果,我们可以将这个饼干j分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。1你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。所以你应该输出1。2。原创 2024-04-04 21:29:34 · 1161 阅读 · 0 评论 -
Day31代码随想录(1刷) 贪心
给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候只能持有股票。你也可以先购买,然后在出售。返回你能获得的利润。7在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。原创 2024-04-05 15:51:06 · 890 阅读 · 0 评论 -
KMP算法(内有动图+推导 小白也能无痛上手)
构建前缀表的过程。前缀表的构建是层层优化的,看完肯定对于kmp的理解更深一步。原创 2024-03-14 21:05:25 · 2874 阅读 · 1 评论 -
Day27 代码随想录(1刷) 回溯
给你一个字符串s,请你将s分割成一些子串,使每个子串都是ss = "aab"s = "a"[["a"]]状态:完成思路:目的是分割使每个子串都是回文串,所以用回溯来解决问题。用result来记录合理的分割方式,用path来装分割的子串,回溯中我们只要从startIndex开始就行了,每一次递归都判断该字串是否是回文串,是就继续不是就继续循环。正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。给定一个只包含数字的字符串s。原创 2024-04-01 12:30:57 · 1084 阅读 · 0 评论 -
Day29代码随想录(1刷) 回溯
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的的解决方案。每一种解法包含一个不同的的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。n = 4如上图所示,4 皇后问题存在两个不同的解法。n = 1[["Q"]]状态:完成。原创 2024-04-03 17:00:09 · 1034 阅读 · 0 评论 -
Day28 代码随想录(1刷) 回溯
换个方向思考先把死结点入栈然后再从死结点出发再回去起始节点就可以了。原创 2024-04-02 21:22:23 · 1566 阅读 · 0 评论 -
Day25 代码随想录(1刷) 回溯
给你一个的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的 所有,并以列表形式返回。你可以按返回这些组合。candidates中的数字可以。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为target的不同组合数少于150个。[2,3,6,7],target =72 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。7 也是一个候选, 7 = 7。仅有这两种组合。原创 2024-03-30 22:21:35 · 549 阅读 · 0 评论 -
Day24 代码随想录(1刷) 回溯
给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按返回答案。[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],[[1]]状态:完成。原创 2024-03-29 12:38:25 · 1008 阅读 · 0 评论 -
Day21代码随想录(1刷) 二叉树
第二种是中序遍历,中序遍历二叉搜索树是递增的,所以中序遍历时,记录上一节点的数值,如果该节点的值就是上一节点的值now++,如果不是就说明这个数字就到尽头了,然后分两种情况,第一种这个数字的个数跟最大的个数一样则收录进list中,如果这个数字个数比最大个数大则清空list并把最大个数变为该数字的个数。要分三种情况在后序遍历时,左节点、右节点都为空则返回空,左节点或右节点有就返回左节点或右节点,都存在则该节点就是最深的祖先节点因为是后序遍历所以肯定是最深的了。给你一个含重复值的二叉搜索树(BST)的根节点。原创 2024-03-26 12:58:21 · 781 阅读 · 0 评论 -
Day22代码随想录(1刷) 二叉树
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]6节点2和节点8的最近公共祖先是6。2节点2和节点4的最近公共祖先是2, 因为根据定义最近公共祖先节点可以为节点本身。状态:完成,一开始没想到可以这么好的利用二叉搜索树的特性。原创 2024-03-27 16:11:20 · 872 阅读 · 0 评论 -
Day23 代码随想录(1刷) 二叉树
感想:今天是二叉树的最后一天,感觉经过这段时间的二叉树的学习感觉学到了很多,二叉树的各种遍历方式,二叉树的各种属性(对称、最大深度、最小深度、平衡......),二叉树的修改以及构造,二叉搜索树的属性,二叉搜索树的属性,二叉搜索树公共祖先,二叉搜索树的修改和构造。思路:他要把二叉搜索树转换成累加树,二叉搜索树是右大左小的所以采用反中序的遍历方式(右中左)然后累加和,完成题目。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。给你二叉搜索树的根节点。原创 2024-03-28 12:08:30 · 1041 阅读 · 0 评论 -
Day18 代码随想录(1刷) 二叉树
给定一个二叉树的root,请找出该二叉树的节点的值。假设二叉树中至少有一个节点。17状态:完成,使用层序遍历思路:层序遍历最后一层的第一个元素。原创 2024-03-24 17:39:28 · 976 阅读 · 0 评论 -
Day17代码随想录(1刷) 二叉树
思路:使用前序遍历,遍历传入参数两个一个是当前节点,一个是是否是左节点,用来区分左右叶子节点,当是叶子节点是sum加上当前节点的值。思路:前序遍历找各个节点的左右节点的深度,如果其中一个左右节点的差大过1则返回-1,则此树不是平衡二叉树。思路:这题用前序遍历,当左右节点都为空时到了叶子节点添加进list中。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。是指该树所有节点的左右子树的深度相差不超过 1。,返回所有从根节点到叶子节点的路径。给你一个二叉树的根节点。是指没有子节点的节点。原创 2024-03-22 12:40:44 · 623 阅读 · 1 评论 -
Day20 代码随想录(1刷) 二叉树
该题使用前序遍历可以满足要求,先找出数组中此时的最大值该值则为根节点的值,然后在递归左右节点,分割数组,最后链接根节点的左右节点完成题目的要求。思路:前序遍历两棵树,分情况进行讨论,当两个节点都是空则返回,如果其中有一个节点不是空则返回该节点,如果两个节点都不是空的则把两个节点之和创建的新数组返回。- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。原创 2024-03-25 14:54:40 · 1084 阅读 · 0 评论 -
Day16代码随想录(1刷) 二叉树
状态:完成思路:使用前序遍历的方式求得二叉树的最大深度,每次递归比较左右节点哪个更加大再加上当前节点(+1),最后得到二叉树最大深度。用层序遍历昨天已经实现过了。原创 2024-03-21 17:10:37 · 319 阅读 · 1 评论 -
Day15 二叉树
感想:二叉树之前没怎么做过,给我感觉挺灵活的,有时候没想到可以这样子做,而且很多数据结构也用到了二叉树,比如堆,周末我想总结一下java各个常用的数据结构的方法的时间复杂度。思路:层序遍历就是从层的两侧向中间去遍历,如果两侧的值不一样或者有空的值就肯定不是对称的。思路:我这样写也可以做出来,最方便的办法肯定就是正向的层序遍历之后把答案翻转,还有一种不用翻转用LinkedList这个链表添加到头就行了。思路:其实这题就是层序遍历的最后一个值的集合,所以只要把每一层的最后一个节点写进结果数组中就可以。原创 2024-03-20 17:23:07 · 577 阅读 · 1 评论 -
Day14 代码随想录(1刷) 42接雨水+二叉树遍历
给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。6上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。9状态:不会,看灵山的视频理解了。原创 2024-03-19 20:12:59 · 291 阅读 · 0 评论 -
Day2 代码随想录(1刷) 双指针
然后看了解析发现可以直接用二分法找到两侧的端点这个方法很好,以找左边界为例,使用二分法去查找,如果mid比target小左边则left=mid+1,如果mid等于target则right=mid,就这样不停地移动最后得到的left就是左边的边界点。当nums[left]不是val时就移动left,left就像个扫地机一样,只要是val他就停下来做交换,把它向后移。循环条件中的left原创 2024-03-07 21:01:30 · 446 阅读 · 2 评论 -
Day8代码随想录(1刷) 字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须、使用 O(1) 的额外空间解决这一问题。状态:完成思路:双指针翻转。交换的时候可以不用创建新的temp存储空间,使用异或如下。给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。k2kkk"bacdfeg""bacd"状态:完成思路:把字符串按2k去分割并对最后一段进行分类讨论。我这写的太冗杂了可以去简化,参考。原创 2024-03-13 13:40:07 · 1037 阅读 · 0 评论 -
Day6代码随想录(1刷) 哈希表
状态:完成该题字母全是小写,所以构建一个哈希表去解决,向哈希表该字母所对应的位置+或-,最后判断是否是字母异位词。先判断两个字符串长度是否一致如果不一致就直接返回false,然后在遍历两个字符串,s++,t--,最后看arr里是否全是0如果全是0则是字母异位词反之不是。原创 2024-03-11 16:55:03 · 500 阅读 · 3 评论 -
Day10代码随想录(1刷) 栈
思路:一个栈stack1用于进栈,一个栈stack2负责出栈。为了模拟队列先进先出的特性,stack2的顺序就是队列的顺序,所以当stack2不为空的时候都不从stack1.pop()。思路:我的思路是在pop(),跟top()里做文章,就是把最后队尾的元素放在队首,top最后要重新把现在队首的元素放回队尾。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(请你仅使用两个栈实现先入先出队列。感想:今天的题比较简单,主要考察的是栈跟队列的使用。你能否仅用一个队列来实现栈。原创 2024-03-15 13:22:33 · 893 阅读 · 3 评论 -
DAY1 代码随想录(1刷) 977 209 59 数组系列 双指针 滑动窗口
然后就想到双指针,一开始我想的是就在nums数组里面直接进行元素交换排序,但没能实现,没能实现原因是双指针移动的时机不正确,比如arr=[-5,-3,-2,-1],-5和-1交换之后,右指针向左移动一个,发现-2比-1大继续移动,但-3平方是要大于-2的导致错误。然后只能向下图一样新建一个结果集数组用来放最终结果,因为题目是非递减就是递增或者一样的元素,左指针比右指针大就放入,左指针向右移动,反之亦同,循环结束条件就是左右指针碰到。使用滑动窗口的原理解题,不断调整窗口的大小实现。原创 2024-03-07 11:43:12 · 526 阅读 · 0 评论 -
Day7代码随想录(1刷) 哈希表
给你四个整数数组nums1nums2nums3和nums4,数组长度都是n,请你计算有多少个元组2两个元组如下:1状态:看了答案思路完成,一开始定nums1的值,然后遍历剩下三个数组的方式超时思路: 把nums1和nums2的和有多少种情况用map存起来,然后在nums3和nums4中遍历并查看map里有无与其相加为0的数字若有则把val加到sum中。map.getOrDefault(key,val)这个方法可以指定默认值然后存取。原创 2024-03-12 21:25:54 · 1497 阅读 · 3 评论 -
Day11代码随想录(1刷) 栈
给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。s = "()"truetrues = "(]"false'()[]{}'状态:完成思路: 括号匹配问题的关键就是出现后括号的时候前面一定是相应的前括号,不然就匹配失败。用栈就可以解决了,就是位于栈顶的括号是该后括号的前括号就行,其他的就不行。前括号就直接进栈,后括号做判断。给出由小写字母组成的字符串S会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。原创 2024-03-16 19:08:46 · 958 阅读 · 1 评论 -
Day4代码随想录(1刷) 链表
删除倒数第n个节点,我运用了双指针去解决问题,快指针先走,要删除倒数第N个,要遍历到倒数n+1上,所以快指针先走n+1步。不使用暴力可以让两个链表从尾端对齐,因为如果相交尾端肯定是一样的,长的链表先向前走差值个节点,然后开始遍历,如果匹配到第一个一样的那么是相交的第一个节点直接返回,如果没有则不相交。该题要想怎么保存现有头节点,因为结束后要返回头节点,所以要构建一个虚拟节点,用虚拟节点来把头节点这一特殊情况给变成正常情况。前面快慢指针判断是否存在环形链表我做出来,找到环形链表的进去节点没搞定。原创 2024-03-10 11:30:11 · 722 阅读 · 1 评论 -
Day3 代码随想录(1刷) 链表
感想:今天用了3个小时进行算法的练习,中间有点分神(鸟叔去找界王修炼了/(ㄒoㄒ)/~~)。今天对于链表的理解更深了,也掌握了如果头节点要分类讨论的情况下可以使用一个dummyNode的哨兵节点去监控,希望这次刷算法能坚持下来,加油。这题不是一次性完成的,在写代码中间有些问题没想清楚,到最后提交的时候才急急忙忙的找是哪里出现的问题。该题关键点是一个dummyNode如果没有他头节点的移除上会要做一个特殊处理,使用两个指针去进行链表节点的删除。这题比较简单了,只要前后两个节点翻转就行了一直遍历下去。原创 2024-03-08 13:35:03 · 355 阅读 · 1 评论 -
Day13 代码随想录(1刷) 栈,堆
给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。滑动窗口的位置 最大值[1]状态:暴力做出来但是超时了,然后看了carl的解析,学习了单调队列,自己尝试做出来了。思路:要知道滑动窗口中的最大值,我们如果暴力的话就是当最大值移动出去就遍历窗口寻找第二大的值,但是这样的时间复杂度就是O(n*k)。原创 2024-03-18 12:50:38 · 911 阅读 · 1 评论