- 博客(45)
- 收藏
- 关注
原创 Day48代码随想录 动态规划
小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root。除了root之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果,房屋将自动报警。给定二叉树的root。返回,小偷能够盗取的最高金额。7小偷一晚能够盗取的最高金额 3 + 3 + 1 = 79小偷一晚能够盗取的最高金额 4 + 5 = 9[1, 104]状态:看题解思路完成了,自己想没想到返回值是二维。
2024-04-25 17:29:22
888
原创 动态规划(爬楼梯)-灵神题单
好字符串为 "00" ,"11" ,"000" ,"110" 和 "011"。可以这样构造得到:"" -> "0" -> "01" -> "011"。从 "000" 到 "111" 之间所有的二进制字符串都是好字符串。之间(包含上下边界)的字符串,那么这个字符串我们称为。由于答案可能很大,请将结果对。一个可能的好字符串是 "011"。如果通过以上过程得到一个。以上操作可以执行任意次。请你返回满足以上要求的。
2024-04-22 19:18:10
483
原创 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
1200
原创 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
1365
原创 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
783
原创 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
930
原创 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
864
原创 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
526
原创 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
1186
原创 Day36代码随想录(1刷) 贪心
思路:贪心思路就是如果前面的数比后面的数字大则把前面的数字减1然后把后面的数字变成9,这样子就可以了,但还有一个问题需要去注意的,就是遍历的顺序问题,如果采用从前到后则会导致值变小导致不符合要求,所以这题采用从后向前,但是从后向前还有一个需要注意的就是什么时候置9,要等所有结束遍历之后再置9,如果在循环中置9会导致有些值赋不上9,比如n=1000时就不行了,要等循环结束之后然后把flag以及后面都置为9。感想:今天完成贪心的所有内容,明天开始动态规划,keep going on。的最大数字,且数字呈。
2024-04-10 15:26:11
460
原创 Day35代码随想录(1刷)贪心
给定一个区间的集合intervals,其中。返回需要移除区间的最小数量,使剩余区间互不重叠。1移除 [1,3] 后,剩下的区间没有重叠。2你需要移除两个 [1,2] 来使剩下的区间没有重叠。0你不需要移除任何区间,因为它们已经是无重叠的了。状态:没做出来,没想明白最少次数是什么意思思路:只要有重叠的肯定要有元素是被移除的,所以这题的解法就是求出所有的重叠区间出来就可以完成题目。
2024-04-09 19:56:42
1125
原创 Day34代码随想录(1刷) 贪心
这题把身高从小到大排,因为先排身高大的人所以无论他放在哪里都是符合的,又因为后面的数字排列时,前面的数字一定比他的大,所以后面的数字在排列时也是符合的。感想:今天时间比较挤,写的时间少了很多,主要是服务器的迁移,差点搞成大错,mysql5.7跟8.0的数据存储方式不一样,不能直接复制数据库的文件,幸好有回收站,linux就寄了幸好windows。编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
2024-04-08 20:48:52
1264
原创 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
1214
原创 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
863
原创 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
1129
原创 Day29代码随想录(1刷) 回溯
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的的解决方案。每一种解法包含一个不同的的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。n = 4如上图所示,4 皇后问题存在两个不同的解法。n = 1[["Q"]]状态:完成。
2024-04-03 17:00:09
1002
原创 Day27 代码随想录(1刷) 回溯
给你一个字符串s,请你将s分割成一些子串,使每个子串都是ss = "aab"s = "a"[["a"]]状态:完成思路:目的是分割使每个子串都是回文串,所以用回溯来解决问题。用result来记录合理的分割方式,用path来装分割的子串,回溯中我们只要从startIndex开始就行了,每一次递归都判断该字串是否是回文串,是就继续不是就继续循环。正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。给定一个只包含数字的字符串s。
2024-04-01 12:30:57
1053
原创 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
510
原创 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
980
原创 Day23 代码随想录(1刷) 二叉树
感想:今天是二叉树的最后一天,感觉经过这段时间的二叉树的学习感觉学到了很多,二叉树的各种遍历方式,二叉树的各种属性(对称、最大深度、最小深度、平衡......),二叉树的修改以及构造,二叉搜索树的属性,二叉搜索树的属性,二叉搜索树公共祖先,二叉搜索树的修改和构造。思路:他要把二叉搜索树转换成累加树,二叉搜索树是右大左小的所以采用反中序的遍历方式(右中左)然后累加和,完成题目。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。给你二叉搜索树的根节点。
2024-03-28 12:08:30
1009
原创 Java基本数据结构(基于jdk11)
java中有很多数据类型,以下数据类型都出于java.util包下且日常经常使用的,先介绍一下接口,接口可以很快的了解到这个数据结构的特性。
2024-03-27 23:46:13
1003
2
原创 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
842
原创 Day21代码随想录(1刷) 二叉树
第二种是中序遍历,中序遍历二叉搜索树是递增的,所以中序遍历时,记录上一节点的数值,如果该节点的值就是上一节点的值now++,如果不是就说明这个数字就到尽头了,然后分两种情况,第一种这个数字的个数跟最大的个数一样则收录进list中,如果这个数字个数比最大个数大则清空list并把最大个数变为该数字的个数。要分三种情况在后序遍历时,左节点、右节点都为空则返回空,左节点或右节点有就返回左节点或右节点,都存在则该节点就是最深的祖先节点因为是后序遍历所以肯定是最深的了。给你一个含重复值的二叉搜索树(BST)的根节点。
2024-03-26 12:58:21
754
原创 新手勇闯leetcode 390周赛
思路:用一个哈希表去存储每个数字的出现次数,用优先队列去实现得到出现次数最多的数字,再使用懒删除,就是只有堆顶的元素的值发生改变的时候才去弹栈的操作,减少了时间复杂度,我一开始实现的还要去查找每一次改变的字母再去删除,于是超时了。思路:这一题我通过找规律得到一个规律移动一次最大值增加的值(1,2,2,3,3,4,4......)这样子的规律增加下去的,所以可以得出下面的算法。第 1 步操作后,有 3 个 ID 为 2 的元素和 2 个 ID 为 3 的元素,所以。,如果在某次操作后集合为空,那么。
2024-03-25 17:16:01
970
原创 389周赛总结
难度:731给你一个字符串s,请你判断字符串s是否存在一个长度为2的子字符串,在其反转后的字符串中也出现。如果存在这样的子字符串,返回true;如果不存在,返回false。true子字符串"ee"的长度为2,它也出现在中。true所有长度为2的子字符串"ab""bc""cb""ba"也都出现在中。s = "abcd"false字符串s中不存在满足「在其反转后的字符串中也出现」且长度为2的子字符串。s状态:完成,但是方法不好,看了灵山的代码确实可以。
2024-03-25 15:14:43
674
原创 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
1062
原创 Day18 代码随想录(1刷) 二叉树
给定一个二叉树的root,请找出该二叉树的节点的值。假设二叉树中至少有一个节点。17状态:完成,使用层序遍历思路:层序遍历最后一层的第一个元素。
2024-03-24 17:39:28
942
原创 Day17代码随想录(1刷) 二叉树
思路:使用前序遍历,遍历传入参数两个一个是当前节点,一个是是否是左节点,用来区分左右叶子节点,当是叶子节点是sum加上当前节点的值。思路:前序遍历找各个节点的左右节点的深度,如果其中一个左右节点的差大过1则返回-1,则此树不是平衡二叉树。思路:这题用前序遍历,当左右节点都为空时到了叶子节点添加进list中。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。是指该树所有节点的左右子树的深度相差不超过 1。,返回所有从根节点到叶子节点的路径。给你一个二叉树的根节点。是指没有子节点的节点。
2024-03-22 12:40:44
596
1
原创 Day16代码随想录(1刷) 二叉树
状态:完成思路:使用前序遍历的方式求得二叉树的最大深度,每次递归比较左右节点哪个更加大再加上当前节点(+1),最后得到二叉树最大深度。用层序遍历昨天已经实现过了。
2024-03-21 17:10:37
296
1
原创 Day15 二叉树
感想:二叉树之前没怎么做过,给我感觉挺灵活的,有时候没想到可以这样子做,而且很多数据结构也用到了二叉树,比如堆,周末我想总结一下java各个常用的数据结构的方法的时间复杂度。思路:层序遍历就是从层的两侧向中间去遍历,如果两侧的值不一样或者有空的值就肯定不是对称的。思路:我这样写也可以做出来,最方便的办法肯定就是正向的层序遍历之后把答案翻转,还有一种不用翻转用LinkedList这个链表添加到头就行了。思路:其实这题就是层序遍历的最后一个值的集合,所以只要把每一层的最后一个节点写进结果数组中就可以。
2024-03-20 17:23:07
500
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
274
原创 Day13 代码随想录(1刷) 栈,堆
给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。滑动窗口的位置 最大值[1]状态:暴力做出来但是超时了,然后看了carl的解析,学习了单调队列,自己尝试做出来了。思路:要知道滑动窗口中的最大值,我们如果暴力的话就是当最大值移动出去就遍历窗口寻找第二大的值,但是这样的时间复杂度就是O(n*k)。
2024-03-18 12:50:38
895
1
原创 新手leetcode 126双周赛被拷打篇
思路:一开始我是对nums数组排序了,然后标记的时候在nums数组中查找相同的值导致超时了。我们可以不对值进行排序我们创建一个数组对下标进行排序,nums中值越小的下标越在前面,这样就省去对nums数组进行查找值的操作了,降低了时间复杂度。上面的函数可以对 id数组根据在nums里的值从小到大的进行排序,这样是升序将顺序调转就是降序。要注意sort时这个数组的类型不能是基本类型如int的,要是Integer这种封装类型。个未标记的最小元素。处的元素标记,并且标记最靠前的。一开始,数组中的所有元素都。
2024-03-17 22:35:22
1029
1
原创 Day11代码随想录(1刷) 栈
给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。s = "()"truetrues = "(]"false'()[]{}'状态:完成思路: 括号匹配问题的关键就是出现后括号的时候前面一定是相应的前括号,不然就匹配失败。用栈就可以解决了,就是位于栈顶的括号是该后括号的前括号就行,其他的就不行。前括号就直接进栈,后括号做判断。给出由小写字母组成的字符串S会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。
2024-03-16 19:08:46
929
1
原创 Day10代码随想录(1刷) 栈
思路:一个栈stack1用于进栈,一个栈stack2负责出栈。为了模拟队列先进先出的特性,stack2的顺序就是队列的顺序,所以当stack2不为空的时候都不从stack1.pop()。思路:我的思路是在pop(),跟top()里做文章,就是把最后队尾的元素放在队首,top最后要重新把现在队首的元素放回队尾。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(请你仅使用两个栈实现先入先出队列。感想:今天的题比较简单,主要考察的是栈跟队列的使用。你能否仅用一个队列来实现栈。
2024-03-15 13:22:33
869
3
原创 Day8代码随想录(1刷) 字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须、使用 O(1) 的额外空间解决这一问题。状态:完成思路:双指针翻转。交换的时候可以不用创建新的temp存储空间,使用异或如下。给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。k2kkk"bacdfeg""bacd"状态:完成思路:把字符串按2k去分割并对最后一段进行分类讨论。我这写的太冗杂了可以去简化,参考。
2024-03-13 13:40:07
1010
原创 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
1438
3
操作系统大实验,实现基本操作系统操作,java
2024-03-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人