- 博客(24)
- 收藏
- 关注
原创 动态规划背包问题
有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0这个问题实际上是一个变种的背包问题,我们可以通过动态规划的方法来解决。
2024-08-11 20:01:48
286
原创 贪心二叉树
在递归过程中,每个节点的状态(是否需要摄像头、是否被覆盖)被传递给其父节点。这种状态传递是通过返回值实现的,从而影响父节点的决策。函数通过递归遍历二叉树的每个节点,根据其左右子节点的状态来决定当前节点是否需要放置摄像头。:每次决策(放置摄像头与否)都是基于当前节点及其子节点的局部信息,而不是整个树的全局信息。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。给定一个二叉树,我们在树的节点上安装摄像头。计算监控树的所有节点所需的最小摄像头数量。,导致成员变量的值不会被递归函数。
2024-07-28 22:06:04
145
原创 贪心算法合集一
首先按照身高从高到低排序,确保了后面插入的人(身高较矮)不会影响到前面已经插入的人(身高较高)的相对位置,从而满足了身高的全局有序性。对于这道题目,我们需要保证每个孩子获得的糖果数至少比其相邻的孩子(如果存在的话)多一个,如果其评分更高。变为负数的下一个加油站开始重新计算,我们可以确保找到的是这样一个起始点:从这个点出发,以这种方式修改数组后,返回数组可能的最大和(返回的是数组可能的最大和,可以排序)在这个过程中,我们始终在寻找一个起始点,使得从这个点出发行驶到任何一个加油站时,
2024-07-09 12:06:08
779
1
原创 打卡回溯算法2
回溯法就是暴力搜索,并不是什么高效的算法,最多在剪枝一下。组合问题:组合问题,如从n个元素中选取k个元素的所有可能组合,可以视为一种树形搜索问题。树的每一层代表一个选择点,从n个元素中选择或不选择某个元素,然后递归到下一层。在组合问题中,为了避免产生重复的组合,我们需要在每一层递归中从某个特定的位置开始遍历元素。startIndex参数就是用来控制这一点的。在上一层选择了一个元素后,下一层应该从这个元素后面的位置开始遍历,以确保不会再次选择到它,从而产生重复的组合。
2024-06-24 10:24:59
271
原创 Day 25 二叉树的终止
不理解用tmp保存root节点,然后删除?root=root->right不会覆盖吗?需要考虑要删除的节点是不是叶子节点,有无左右孩子有左右孩子的话,需要将左孩子节点移动到右孩子节点的左面节点的左孩子上。
2024-06-09 23:45:19
834
原创 波束雷达多目标跟踪的自适应波束调度算法研究(一)
在现代雷达系统中,敏捷波束雷达因其能够迅速调整波束方向,从而实现对多个目标的快速、准确跟踪而备受关注。然而,当雷达系统需要同时跟踪多个目标时,特别是在目标数量多、机动性强、环境复杂的情况下,多目标跟踪问题变得尤为复杂和具有挑战性。首先,多目标跟踪需要雷达系统具备高效的目标检测能力。在复杂的电磁环境中,雷达系统需要准确地区分信号和噪声,以及不同目标反射的回波信号。这需要雷达系统具备先进的信号处理技术,以确保在多个目标同时存在时,能够准确地识别并跟踪每一个目标。
2024-06-04 20:28:46
1011
原创 Day 20 二叉树补补补
当我们从栈顶取出一个节点时,如果这个节点是NULL,那么我们知道下一个节点就是需要处理的节点,因为其左右子节点都已经被处理过了。我们再次进入while循环,取出栈顶元素NULL,然后进入else分支,弹出NULL,取出栈顶元素2,并将其弹出,然后交换2的左右子节点。在这个代码中,NULL在栈中的作用主要是作为一个标记,用来表示当前节点的左右子节点都已经被访问过了,下一步需要处理当前节点(交换其左右子节点)。如果栈顶的节点为空,那么将其弹出,然后再次取出栈顶的节点,并将其弹出,然后交换这个节点的左右子节点。
2024-06-01 21:01:17
804
原创 Day14 二叉树入门
这样,通过递归的方法,我们实现了二叉树的前序遍历。在每次递归调用中,会先处理当前节点,然后递归处理左子树和右子树,直到遍历完成。通过递归实现遍历过程,可以很自然地按照前序遍历的顺序访问节点。
2024-05-25 14:25:43
199
原创 Day18补档 二叉树 part02层序遍历
接着处理节点5,node指向5,nodePre的next指向node,然后更新nodePre,将5的左右子节点(如果有的话)也放入队列。首先处理节点2,因为这是第一个节点,所以nodePre和node都指向2,然后将2的左右子节点4和5放入队列。接着处理节点3,node指向3,nodePre的next指向node,然后更新nodePre,将3的左右子节点6和7也放入队列。开始第一轮循环,队列中有1个节点,即1。因为这是第一个节点,所以nodePre和node都指向1,然后将1的左右子节点2和3放入队列。
2024-05-24 16:20:49
497
原创 5.23真题训练
1. 小美有一个长度为n的数组,她最多可以进行k次操作,每次操作如下:选择两个整数i, j(1 ≤ i < j ≤ n)选择两个整数x, y 使得x * y = a_i * a_j将a_i替换为x,将a_i替换为y她希望最多进行k次操作后,最后数组中的元素总和尽可能大。输入描述一行两个整数 n, k, 表述数组长度和操作的次数一行n个整数a_1、a_2……a_n,表示数组的元素。输出描述输出一个整数,表示最后数组中的元素做那个和最大值,结果对10^9+7取模示例1。
2024-05-24 13:20:43
378
1
原创 二叉树的迭代法
深度优先遍历「遍历」和「搜索」可以看作是两个的等价概念,通过遍历的可能的情况达到搜索的目的。遍历是手段,搜索是目的。因此「深度优先遍历」也叫「深度优先搜索」。再次分析下前中后续的代码的迭代遍历,这是一种基于栈的迭代方法,模拟了递归的过程。通过栈来模拟函数调用栈,实现了前序遍历。每次处理一个节点时,都将其值加入结果向量,并按照根右左的顺序将孩子节点压入栈中,保证了栈顶节点的访问顺序符合遍历顺序。
2024-05-16 15:47:17
885
原创 关于堆的碎碎念
默认情况下是一个最大堆,这意味着队列的顶部是最高优先级的元素。在使用默认的比较方式(比如对于整数,就是使用。,这意味着在插入和弹出元素时,较大的元素将具有更低的优先级,从而形成了一个最小堆。迭代器的使用可以方便地遍历容器中的元素。)时,最大的元素具有最高的优先级,因此会位于队列的顶部。当我们自定义一个比较类或函数时,我们实际上是在告诉。容器中第一个键值对的迭代器,即指向容器的起始位置。,可以创建一个使用"大于"关系进行比较的最小堆。),并对每个键值对进行了相应的操作。所以,让我们看看这个自定义的比较类。
2024-05-11 16:05:26
416
1
原创 Day 13 补进度篇 —— 栈和队列
1. 初始化双端队列:使用一个双端队列(deque)来维护一个单调递减的滑动窗口。队列中存储的是数组 nums 的索引,而不是实际的值。这样做的好处是我们可以方便地在 O(1) 时间复杂度内判断队列头部的索引是否还在当前窗口内。2. 填充初始窗口:遍历数组 nums 的前 k 个元素,并将它们的索引依次添加到双端队列中。在添加的过程中,如果新元素的值大于队列尾部的元素对应的值,就不断从队列尾部移除元素,直到队列为空或者新元素小于等于队列尾部的元素。这样可以保证队列中的元素对应的值是单调递减的。
2024-05-10 22:03:59
690
原创 Day 8 字符串篇补进度
可以使用标准库中的 <iostream> 来处理输入输出<string> 和 <algorithm> 来处理字符串//使用std命名空间,这样我们就可以直接使用如cin、cout、string等标准库中的对象,而不需要每次都加上std::前缀。cin >> k;
2024-05-08 15:50:04
357
1
原创 Day11 补进度篇
20. 有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。由于栈结构的特殊性,非常适合做对称匹配类的题目。
2024-05-07 12:14:56
330
原创 Day 10 补进度篇——栈和队列
今日任务:理论基础232.用栈实现队列225. 用队列实现栈在C++中,std::stack是一个容器适配器,而不是一个容器本身。它基于另一个容器(如std::deque或)来提供栈(后进先出,LIFO)的行为。不,std::stack不是一个容器。它是一个容器适配器,它封装了对底层容器的访问,并提供了一个栈的接口(即push()pop()top()empty()size()等方法)。
2024-05-06 22:42:33
726
2
原创 第三章 哈希表part02
454.四数相加II给你四个整数数组nums1nums2nums3和nums4,数组长度都是n,请你计算有多少个元组能满足:我的第一反应是,两个两个组合去判断是否在其中?但是好像要是元组的个数,那就不难。
2024-05-06 18:03:01
861
1
原创 Day03 周末疯狂补进度篇之链表
节点定义和指针操作:在C++中,需要使用结构体定义链表节点,其中包括数据和指向下一个节点的指针。通过指针操作,可以在链表中进行节点的插入、删除和遍历。异常处理:在C++中,需要显式处理一些异常情况,比如节点不存在或链表为空时的操作。在上面的代码示例中,当要删除的节点不存在时,会输出相应的错误信息。感觉还是开头,结尾,删除和插入的基本操作,但是自己构建链表不太会,还要定义private,自己释放空间。),这样外部代码就不能直接访问或修改链表节点,只能通过链表类提供的公共(,请你反转链表,并返回反转后的链表。
2024-04-26 17:12:12
389
1
原创 ACM练习篇1
输入中每行是一对a和b。其中会有一对是0和0标志着输入结束,且这一对不要计算。ps.在Python中,缩进通常使用四个空格来表示代码块的层级关系。如对于输入中的第二对a和b,在输出中它们的和应该也在第二行。输入包含一系列的a和b对,通过空格隔开。对于输入的每对a和b,你需要在相应的行输出a、b的和。对于输入的每对a和b,你需要依次输出a、b的和。如第二对a和b,他们的和也输出在第二行。你的任务依然是计算a+b。
2024-04-24 11:18:36
185
原创 Day05 今日再看哈希,能看出什么咧
据说要熟悉下定义,检索下检索下~哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素那么哈希表能解决什么问题呢,例如要查询一个名字是否在这所学校里。要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。将学生姓名映射到哈希表上就涉及到了。哈希表的内部实现原理是利用哈希函数将键映射到存储桶(buckets)的索引上,从而实现高效的数据查找和插入操作。哈希函数将键转换为一个固定大小的哈希值,然后通过取模运算将哈希值映射到存储桶的索引上。
2024-04-23 01:12:08
729
原创 Day04 链表2
24. 两两交换链表中的节点一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。# 设置虚拟节点试图统一链表里的操作,虚拟节点的设置方法是?遇到了问题,想知道更新的操作,在当前节点指向的需要交换的节点,current.next和current.next.next都存在的时候,交换后第一个节点要指向第二个节点的next,current要指向第二个节点,第二个节点要指向起一个节点这个顺序怎么来,
2024-04-21 19:24:26
993
1
原创 Day 02 数组
这题尴尬了,很快想到了双指针滑动,但是一直很纠结,想是先固定left,去寻找满足求和大于等于target的right,先确定一个窗口,然后去移动两个指针,问题就来了,怎么同时移动两个指针呢?我还在想写窗口的大小的+1和-1,但是这又涉及到和target的大小判断,要记录最小值。还有一个就是while left<=right:的判断,什么时候结束,我最开始觉得是left<right就可以了,当left==right时,当数组中只剩下一个元素时,它的平方就是需要添加到新数组中的最后一个元素。
2024-04-20 11:29:16
322
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人