自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 Day 14 二叉树P1

1. 二叉树的分类(1)满二叉树(全部平衡填满):k层深,2^k-1个节点(2)完全二叉树(每层填满):在完全二叉树中,除了最底层节点可能没填满外,其余,并且最下面一层的节点都集中在该层。堆是一个完全二叉树(4)平衡二叉树(左右平衡):一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。(1)深度优先搜索:前序、中序、后序(递归)(2)广度优先搜索:层序(队列迭代)3. 二叉树的定义。

2024-03-12 14:51:41 255

原创 Day 24 回溯算法 1

在(3)中,可以发现如果循环到某个位置,剩下的不足以满足条件(比如剩下3个元素,但是path中还需要4个元素才满),就需要停止。可以发现,剪枝条件和path还需要的元素(k-path.size())有关、与元素个数有关n。这里递归函数就是每一层的遍历,起名为backtrace。这里遍历需要用for循环的起始终止位置,因此参数为n和k。每一层从startindex开始往后一直遍历到n,每一次遍历,都在path中。终止条件由path.size()==k来判断,递归(startindex+1),

2024-01-15 23:26:54 454

原创 Day 48 动态规划 9

1. 思路本体是非常简单的动态规划问题,dp[i]就代表0-i这些家可以抢劫到的最大金额,分两种情况进行讨论。一个是抢当前的不抢之前的,一个是不抢当前的。代码如下:1. 思路这道题也很简单,分解成0~n-1以及1~n这两个区间即可,分别比较。在实现的时候,我使用了两个额外的数组记录0~n-1以及1~n,实际上可以将打家劫舍1中的函数改编成start和end定义的,这样就不用额外分配内存了。 1. 思路(1)对打家劫舍的泛化可以看出,打家劫舍其实是在打劫和不打劫之间选择的一个问题,如果把这个选择明

2024-01-15 19:22:25 841

原创 Day 46 动态规划 8

1. 思路(1)对背包问题的转化这道题可以很简单的转化为,目标字符串为背包,物品为字典内元素,优化目标为是否可以进行拆分。但是怎么进行dp数组的构建,是一个比较困难的问题。遍历每个物品不太现实,因为每个物品都是字符串,不可比。因此,。这是一种(2)dp数组dp[i]代表该i长度可以拆分为很多单词(3)递推公式在每个背包限制i的情况下,遍历从0到i的所有可能j,递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。

2024-01-14 22:39:20 379 1

原创 Day 45 动态规划 7

1. 思路不难看出,这道题是一个完全背包计数问题,因为是排列(131和113是两种),因此背包遍历在外循环,物品遍历在内循环。 1. 思路这道题是典型的完全背包问题(均正序),但是dp数组更新的方式不同:dp[j] = min(dp[j], dp[j-coins[i]]+1)由于钱币对于结果没有影响(我们要找的是最小个数,并非计数),因此使用先元素再背包的遍历方法或者反之都可以。 比较特殊的是初始化方法,可以考虑0代表什么含义(确认[0],以及第一轮(第一个物品)该如何初始化(确认其他位置)。dp[0

2024-01-14 21:13:29 360 1

原创 Day 44 动态规划 6

1. 思路(1)dp数组定义以及更新模式完全背包和01背包的区别可以从展开的二维背包中看出来:01背包:完全背包:区别就在i-1上。在保持原状不变的情况下,结论是一样的。但是,在放入第i-1个物品的情况下,如果是01背包,则这个物品是唯一的,所以要退回i-1这一行,寻找最优。但在完全背包的情况下,由于这个物品并非唯一,所以要在第i行寻找。相当于,(2)dp数组的压缩以及遍历方式如果将二维数组压缩成一维数组,在01背包的情况下,由于是i-1到i的映射,。

2024-01-14 19:35:20 984 1

原创 Day 43 动态规划 5

这里我们发现,后续所有的情况需要在第一个元素上累加,所以将其定义为1更有意义。(5)遍历顺序内层倒叙,外层正序。

2024-01-14 17:12:02 797 1

原创 Day 42 动态规划 4

1. 思路背包问题的主要特征为,,因此可以构造二维dp数组,一个维度记录成本,一个维度记录收益,一步步寻找最优解。(1)dp数组以及下标含义dp[i][j]代表0-i的物品,。注意,这里,比如kg。因此,如果有3个物品,成本分别为1、3、5kg,则i取0-2,j取0-5。(2)确定递推公式每次更新都有两个可选择的方式,。如果放入,则放入前背包中的物品个数位i-1,最大容量为j-weight[i],放入后价值+value[i]。如果不放入,则背包保持之前的状态,有i-1件物品,j的最大重量。

2024-01-12 22:15:51 894 1

原创 Day 41 动态规划 2

1. 思路(1)贪心算法这道题最开始想到的是贪心。因为我们知道把一个数拆分成两部分,两部分越接近,乘积越大。而这两部分还可以再拆分,让四个数的乘积最大。这样拆分,最后能拆到2和3。这是因为2和3的拆分乘积比它们小。而可以发现,拆的3越多越好,但不能剩下1。因此,策略为,尽可能拆3,如果剩下1就少一个3留一个4,如果剩下2就保留这个2。这种策略可以让全局最优。这里可以将代码优化。我对n%3进行分类讨论,这样做其实麻烦了。因为其实最后一个乘的东西就是<4的余数。

2024-01-10 22:40:16 315

原创 Day 39 动态规划 2

1. 思路这道题的dp数组是二维的,更新方式也比较简单,初始点为左上角,设置为0。可以把边上的全部设置为1,减少计算复杂度,因为边上的更新逻辑和中心的不一样。2. 其他(1)这道题也可以利用数论的方法。因为一共需要走的步数一定是m+n-2,m-1个向下的n-1个向右的,因此只需要枚举出所有可能的走法即可。答案是C(m-1)(m+n-2)。(2)这道题也可以用深度搜索来做,但是因为需要保留各种计算结果,十分复杂。

2024-01-10 15:36:24 928

原创 Day 38 动态规划1

而在这道题里面明显没有定义,因此都可以。(2)如果一次最多走m步,应该如何。这需要对状态转移充分理解,这道题里面是。

2024-01-10 11:57:48 355

原创 Day 37 贪心算法 6

1. 思路从后向前判断,如果不呈现单调递增的状态,后一位变成9,前一位-1。这里局部最优是每两位的最优解,从后向前线性遍历能得到全局最优。。如果出现了上述的两位数倒序情况,之后的所有数字都应该变成9。例如52583,最小的递增数是49999。中间三位其实是递增的,但是在52调整成49后,后续的所有数都应该是9,因此应该,先记录,最后再遍历一遍完成调整。至于为什么从头开始最先出现倒序但不从头开始遍历,就是因为(如果倒序,前一位-1),因此必须从后向前遍历。2. 方法。

2024-01-10 09:19:40 700

原创 Day 36 贪心算法 P5

然后从前往后遍历,如果遇到max==index,说明这属于一堆。相当于用位置对应位置进行记录。

2024-01-06 01:21:37 923 1

原创 Day 35 贪心算法 4

1. 思路这道题其实很简单,因为。如果是5元直接收下,如果是10元,需要找5元,然后收10元。这两个都是固定的。最后,如果是20元,有两种找钱的方式,更好的局部最优解是优先找10元的,。当然,收的20元没有用武之地。2. 实现20元优先找10元的,自己实现的时候有点乱。可以直接按照逻辑,找10元的和5元的各一张,如果不行,就找3个5元的,如果还不行,就是失败。

2024-01-04 03:04:30 951 1

原创 Day 34 贪心算法 3

这样,先翻过来的是绝对值最大的负数,收益最高。这点没有想到。

2024-01-04 01:49:31 327 1

原创 Day 32 贪心算法 P2

1. 思路这道题非常简单,就是计算股票净上升,计算赔率用的。底层思想是,分解每天的利润,将正的加总。局部最优就是每天的正利润,全局最优就是局部最优加总。可以看出,。

2024-01-03 23:45:00 345 1

原创 Day 31 贪心算法 P1

1. 思路很典型的贪心算法,每次恰好满足最大胃口的孩子就可以了。实现过程中,先进行排序,之后用大的饼干满足胃口大的孩子。每次最优做到全局最优。2. 注意当没有饼干的时候,index一开始为-1。这里并不用max来确保,只需要把index>=0这个条件前置。这样判断失败自动跳过循环。

2024-01-03 22:30:00 329 1

原创 Day7 哈希表2

这是因为,如果选择了两个相同的元素,则固定的起始元素则会相同,则有可能选择到重复的组合(可行组合为123,1(iter)123,11(iter)23重复),且不可能选择到不同的组合(可行的组合为112,1(iter)12成功,11(iter)失败)。但是,需要注意元素如果存在负数,可能会出现问题(target=-10,[-4,-3,-2,-1]),因此需要加一个元素求和大于0的条件。如111123,寻找相加为2的两个数。在这道题中,字典的所有key都是a-z区间内的,所以满足紧凑有限的特征,应该利用数组。

2023-12-09 02:12:36 741

原创 Day 5 哈希表1

1. 定义:一般哈希表都是用来快速判断一个元素是否出现集合里,但是哈希法也是牺牲了空间换取了时间。将元素映射到哈希表上就涉及到了hash function ,也就是哈希函数。2. 解决哈希碰撞的方式是拉链法(用链表)和线性探测法。3. 实现方式:红黑树是key有序的平衡二叉树。优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。

2023-12-06 21:45:20 828 1

原创 Day 4 链表2

24. 两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/答案链接:代码随想录思路:思路很简单,遍历链表,更换两两元素的位置。难点在于每次换位置的实现。解答:感悟:(1)firstnode不可以移动。在第一遍做的时候,想到了用虚拟节点指向head,但是在遍历的时候,用虚拟节点firstnode进行移动,也就是变动了firstnode。这相当于链表的头一直在变。正确的做法是另声明一个变量cur,让cu

2023-12-06 00:35:12 751 1

原创 Day3 链表初步

(3)在add的时候,new->next = temp->next,如果是加入头节点,temp是dummy。开始,因此用于遍历的tempnode = dummyhead,while里面一共循环index次,循环完正好能将tempnode移动至index-1。,一个记录前一个,一个记录当前的,一个记录后一个。让后一个成为后一个,当前的指向前一个,前一个变成当前的,当前的变成后一个(temp)。,一个是和之前一个节点的(需要指回去),一个是和之后一个节点的(temp = temp->next)。

2023-12-01 11:30:59 880 1

原创 Day 2 数组2

在这道题目里,当目前的窗口和没有达到目标的时候,需要包含下一个数字。当目前的窗口达到目标的时候,需要记录长度,并尝试缩小这个区间。打印轮数是n/2,注意如果n为奇数,则中心不能被打印,所以还要判断一下最后补上。最开始考虑这个问题的时候,担心缩小区间这个步骤可能会丢掉潜在的核心元素,陷入局部最优解。因此,题目可以被分为两个部分,一个从一边开始,一个从另一边开始,不断比较往中心靠拢。1. 在result_sum++的位置,nums[end]写成nums[start],导致结果总是4,对变量定义不清晰。

2023-11-30 14:29:10 906

原创 Day1 数组基础

在本题中即为left和right标杆的更新,确定的新left和right标杆是下一轮寻找的区域边界。例如区域是left - mid - 1,如果右边是开的,那么右边就是mid,如果是闭的,右边就是mid - 1。从上述的两个条件不难看出,利用right和left确定查找区间是需要人为假设的。最终查询位置:left = right - 2,此时 middle = ( left + right ) / 2。因此,middle的计算方式为ceil((left+right)/2)。middle 至 right。

2023-11-30 01:44:07 828 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除