
数据结构
文章平均质量分 60
刷题笔记
ZEKEGU1997
温故而知新,多看多写
展开
-
划分为k个相等的子集
首先我们可以知道有两种情况一定是false的,一种是整个数组的总和不能被k整除,还有一种是数组中的最大值大于均分后的平均值。我们以上图的数组为例,第一步先从最大且没被使用的数i开始, 求出i与sum的差值。其次我们先将数组排序,并且建立一个用来标记每个元素是否已经被使用的bool数组。接下来就是最重要的回溯算法了。设均分后的每组之和为sum。原创 2022-09-20 20:36:46 · 325 阅读 · 0 评论 -
扫描线+离散化 计算矩形面积
我们给出了一个(轴对齐的)二维矩形列表 rectangles。对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标, (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。计算平面中所有 rectangles 所覆盖的 总面积。任何被两个或多个矩形覆盖的区域应只计算 一次。返回 总面积。因为答案可能太大,返回 10^9 + 7 的 模。i。原创 2022-09-17 22:11:15 · 442 阅读 · 0 评论 -
最长同值路径
给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值。将左节点的函数返回值记为l,右节点记为r。另设l0和r0表示包含当前节点的路径长度,初始化为0,若当前节点与左节点值相同则l0=l+1,否则仍保持为0,右节点同理。,以图中的根节点为例,它返回的是0,因为左右节点都不是1。若输入4,则返回1,因为向左或右的路径都是1,注意左右的路径虽然可以相连,但它不是递归函数要返回的值。以最高的4节点为例,最长路径是左右相加,所以当l0+r0大于res时更新res。原创 2022-09-02 21:42:23 · 274 阅读 · 0 评论 -
下一个排列
整数数组的下一个排列是指其整数的下一个字典序更大的排列。例如,arr=[1,2,3],以下这些都可以视作arr的排列[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而arr=[3,2,1]的下一个排列是[1,2,3],因为[3,2,1]不存在一个字典序更大的排列。类似地,arr=[2,3,1]的下一个排列是[3,1,2]。例如,arr=[1,2,3]的下一个排列是[1,3,2]。...原创 2022-07-31 21:37:12 · 99 阅读 · 0 评论 -
不简单的简单题 DP之最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。这道题的做法是动态规划,从第二个元素遍历数组,若前一个元素大于0,则将它与当前元素的和放在当前位置上,这样一来每个位置上存储的就是目前当前元素参与其中的最大子数组之和,遍历结束后再找出其中的最大值即可。public class Solution { public int MaxSubArray(int[] nums) { if(num原创 2022-04-18 21:58:02 · 200 阅读 · 0 评论 -
图的拓扑排序--Khan算法
大家在上大学的时候,应该都遇到过这样的情况,有些高级的课程需要你先完成基础课程后才可以学习。在「图11. 课程关系图」中,如果你想选课程 C,那你需要先完成课程 B,如果你想选课程 B,那么你需要先完成课程 A。此时,就需要「拓扑排序」的帮忙了。「拓扑排序」针对的是 有向无环图 的一种算法。它是对「图」中所有顶点按照先后顺序的一种线性排序。换句话说,在如果存在顶点 u 和顶点 v,要想到达顶点 v,则必须要到达顶点 u 。那么在「拓扑排序」中,顶点 u 必须处于顶点 v 的前面。Khan算法的步骤如原创 2022-04-14 20:26:53 · 575 阅读 · 0 评论 -
加权图的单源最短路径
Dijkstra 算法dijkstra算法是一种贪心算法,它只能使用在没有负权值的加权图中。它的步骤如下创建一个记录当前最短路径的数组near和一个标记某点是否已在最短路径中的数组isGone,如果需要找出最短路径经过了哪些点,则还需要创建一个用来记录最短路径中上一个节点的数组last。 将near全部值设为一个无穷大,isGone全部设为false,将出发点的near设为0 找到当前near中最小且对应isgone为false(未加入最短路径)的点x 遍历与它直接相连且isGone为fals原创 2022-04-11 17:03:45 · 1494 阅读 · 0 评论 -
最小生成树算法
生成树 指的是「无向图」中,具有该图的 全部顶点 且 边数最少 的连通子图。最小生成树指的是「加权无向图」中总权重最小的生成树。连接所有点的最小费用给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单原创 2022-04-10 19:51:30 · 1734 阅读 · 0 评论 -
图的DFB与BFS
图的DFS与BFS和二叉树原理是一样的,不过在保存遍历序列的时候要注意,一般C#中用List来保存序列,而List是引用类型。DFS主要是利用递归的方式,不同问题中递归的结束的条件可能有所不同。BFS采用队列的方式,不过队列的类型不一定是节点,也可能是List,即序列,比如需要求某两点之间的路径的时候。所有可能的路径给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) 。graph[i] 是一个从节点 i 可以访问的所有节点原创 2022-04-08 17:05:53 · 543 阅读 · 0 评论 -
并查集问题
并查集问题指的是告诉你许多组两点之间的连接状态,要求某两点是否相连或者求有多少个连通图。这种问题的求解是比较模板化的,关键在于建立find函数和union函数。find函数的主要作用是找到一个节点的根节点,union函数的作用是将某两个点的根节点相连。主要的解题步骤如下:建立一个长度等于节点数的root数组和rank数组,root[i]=i,rank[i]=1. 创建一个递归find函数,当x==root[x]时返回x,否则就root[x]=find(root[x]),同时改变rank数组ra原创 2022-04-08 15:47:00 · 524 阅读 · 0 评论 -
时间复杂度 O(n) 级排序算法
《算法导论》定理 8.1:在最坏情况下,任何比较排序算法都需要做 O(nlogn) 次比较。《算法导论》推论 8.2:堆排序和归并排序都是渐进最优的比较排序算法。所以时间复杂度 O(n) 级排序算法都是不进行比较的算法而通过元素本身的特性进行排序的算法,因此都有一定的限制,并不是在所有情况都能使用,主要的有:计数排序,基数排序和桶排序。计数排序计数排序需要提前知道所有元素的取值范围,比如【0,10】,依据这个范围建立一个数组t[11],并将其全部初始化为0,接下来遍历需要排序的数组,假设遍历原创 2022-04-06 21:06:56 · 4099 阅读 · 0 评论 -
时间复杂度O(nlogn)的排序算法
时间复杂度O(nlogn)的排序算法有四种,分别是希尔排序,堆排序,快速排序和归并排序。这四个排序都非常重要。希尔排序希尔排序本质上是插入排序的优化,先对间隔较大的元素进行插入排序,完成宏观调控,然后逐步缩小间隔,最后一轮一定是间隔为 1 的排序,也就是插入排序。间隔在希尔排序中被称为「增量」,增量序列不同,希尔排序的效率也不同。堆排序堆排序的关键在于建堆,堆分为大顶堆和小顶堆,大顶堆中最大的元素在堆顶,小顶堆同理。堆实际上是一颗完全二叉树,不过为了方便我们把它用数组的形式储存,储存的顺原创 2022-04-05 22:57:39 · 11868 阅读 · 0 评论 -
二叉搜索树用法及例题
二叉搜索树定义就是每个节点的左子节点值比它小,右子节点值比他大,也就是说它的中序序列是按顺序排列的。它的最大特点是可以比较快地插入和删除节点而保持排序,由于这个特点就可以用它存储一些需要多次插入或删除元素并保持顺序的集合。显然在二叉搜索树中查找一个元素是很容易的,插入元素也一样,而删除元素要相对难一些。删除二叉搜索树中的节点首先当然是搜索这个结点,不妨假设这个结点就是根节点。假如此时根节点的任一子节点为空,只要不空的子节点作为新的根节点就行了。假如两子树都不为空,新的根节点可以来原创 2022-03-29 16:21:42 · 2004 阅读 · 0 评论 -
C#哈希表经典例题
哈希表是用来储存键值(key/value)对的数据结构,它有以下属性与方法通过键做索引可以得到值,如hash[key]=value哈希表不能在声明时指定类型,所以调用其中的值必须进行强制转换。哈希表常用的场景,一是当字符等数据重复多次出现,并且需要记录次数的时候,二是存在关联或者成对的数据需要调用时,比如人名和学号。寻找重复的子树给定一棵二叉树root,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。...原创 2022-03-27 17:30:47 · 1230 阅读 · 0 评论 -
队列与BFS的常见做法
广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径。队列非常适合用来处理标准的BFS。以计算最短路径为例,BFS通常有以下步骤:创建一个合适大小的bool数组或哈希表来记录节点是否被遍历过,初始时将所有所有位置置为false; 创建队列,注意队列的数据类型 确定起点,并将起点入队,将起点对应位置置为true,路径长度level=1 当队列不为空时并且没有到达终点时循环以下步骤 将当前队列长度记为count,出队所有count个元素 每出队一个节点,依次判断它周围的点是否原创 2022-03-22 21:59:27 · 813 阅读 · 0 评论 -
C#栈的实现及简单使用
栈的特点就是后进先出,它的实现比队列更简单,用一个列表或数组即可。public class MinStack { List<int> stack; public MinStack() { stack=new List<int>(); } public void Push(int val) {//入栈 stack.Add(val); } public void Pop() {//出原创 2022-03-20 17:22:42 · 1643 阅读 · 2 评论 -
二叉树经典例题
解决二叉树相关问题,常见的思路有两种,一是利用二叉树的遍历序列,二是利用递归,当然也可能是二者都有。对称二叉树判断一个二叉树是否关于root轴对称。这道题看起来似乎可以用中序遍历解决,因为对称二叉树的中序序列一定是回文的。但是中序序列为回文的二叉树未必是对称的,比如上图中假如把两个叶子节点的值改为2,它的中序就是2,2,1,2,2,但是它并不对称。这道题应该用递归来解决,不过注意如何比较左右子树public class Solution { public bool IsSy原创 2022-03-18 20:23:21 · 1547 阅读 · 0 评论 -
二叉树的遍历
深度遍历深度遍历又分为前序,中序,后序。无论是哪一种,左子树的序列、根节点和右子树的序列都是分开的,利用这一点可以递归解决深度遍历public List<int> InorderTraversal(TreeNode root) { List<int> a=new List<int>(),b=new List<int>(),c=new List<int>(); if(root==null) r原创 2022-03-18 16:24:11 · 1061 阅读 · 0 评论 -
C#队列实现及简单使用
队列的特性很简答,就是先进先出,一般利用数组来实现。实现队列自然要实现几个函数:入队,出队,判断队满,判断队空,获得队头,队尾。实现队列的关键在于队头指针和队尾指针的设置:假设初始状态下,队头指针为0,队尾指针为-1,那么两个指针指的位置分别就是队头与队尾。当队尾的下一个是队头时队空,当队尾的下下个是队头时队满。 假设初始状态下,队头队尾指针都为0,那么队尾指针指的是队尾,而队头指针的下一个位置才是队头。当两指针相等时队空,当队尾指针的下一个是队头时队满。如果我们画个图就会发现,不管怎么设置原创 2022-03-15 19:51:49 · 5766 阅读 · 0 评论 -
字符串和数组中的双指针方法
移除特定元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。如上图所示 ,当fast遇到val时一直前进直到遇到第一个不是val的值或者离开数组,然后将不是val的值赋值给slow值,注意无论slow是否指在val值上都要被fast值所覆盖,如下图这个瞬间,slow指的值实际上是3并原创 2022-03-15 14:27:48 · 218 阅读 · 0 评论 -
杨辉三角问题
杨辉三角的主要性质: 每个数等于它上方两数之和。 每行数字左右对称,由1开始逐渐变大。 第n行的数字有n项。 前n行共[(1+n)n]/2 个数。 第n行的m个数可表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。 注意虽然其中的每个数都可以用组合数C(n-1,m-1)表示,但是由于组合数公式需要用到阶乘,而阶乘25以上就会超过long长整型的上限,所以通过组合数直接求某个值或某行的值只能是n小于等于25。否则就必须通过迭代相...原创 2022-03-14 22:12:07 · 775 阅读 · 0 评论 -
字符串经典问题
最长回文子串给你一个字符串 s,找到 s 中最长的回文子串。注意,空串的创建方法是string xx="";C#中可以使用+来串联字符串;public class Solution { public string LongestPalindrome(string s) { string str=""; bool ishw; for(int i=0;i<s.Length-1;i++) { f原创 2022-03-12 23:00:53 · 803 阅读 · 0 评论 -
二维数组经典问题
解决二维数组问题需要注意的几个点:二维数组中行数和列数不一定相同,注意具体情况 多通过画图等手段找到索引之间的规律 注意数组的边界条件旋转矩阵旋转90度实际上是四个数字交换位置,那么我们只要遍历四分之一的数组,每次找到另外三个点,交换它们的位置就可以了。如何交换呢,我们假设4个数字按顺时针顺序分别为1,2,3,4,则交换以后原来位置上应该是4,1,2,3.而需要遍历的那四分之一数组就是正方形的上边为底的等腰直角三角形,如下图,注意三角的右对角线上的数字是不用遍历的,因为它们与左对角原创 2022-03-11 15:08:23 · 649 阅读 · 0 评论 -
链表经典问题(二)
合并升序列表递归法当其中一个链表为空时,直接返回另一个。当都不空,假设除较小的头节点外都已合并,则只需要把头结点与以排列好的的头相连。class Solution {public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { if(list1==nullptr) return list2; if(list2==nullptr) return原创 2022-03-07 21:50:25 · 120 阅读 · 0 评论 -
链表经典问题
反转链表反转链表有两种方法,分别是迭代法和递归法。迭代法有两种思路,一种是把头结点的下一个节点一次移动到第一个,直到头结点变成最后一个;第二种是依次把第一个节点移动到尾结点的后面,直到尾结点变成第一个。递归法假设除头节点以外的所有节点都已反转,把头结点以后的链表看做一个整体,则需要做的操作就是把头结点移动到它的后面。class Solution {public: ListNode* reverseList(ListNode* head) { if(head原创 2022-03-06 22:07:14 · 496 阅读 · 0 评论 -
链表双指针问题
让我们从一个经典问题开始:给定一个链表,判断链表中是否有环。想象一下,有两个速度不同的跑步者。如果他们在直路上行驶,快跑者将首先到达目的地。但是,如果它们在圆形跑道上跑步,那么快跑者如果继续跑步就会追上慢跑者。这正是我们在链表中使用两个速度不同的指针时会遇到的情况:如果没有环,快指针将停在链表的末尾。 如果有环,快指针最终将与慢指针相遇。一般来说我们把快指针的速度设为2,慢指针设为1。求环形链表的入环点问题描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如原创 2022-03-04 15:32:37 · 731 阅读 · 0 评论 -
动态规划(HDOJ2084,凑零钱问题)
基本思想动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多...原创 2020-03-24 18:19:05 · 868 阅读 · 0 评论 -
HDOJ2089 不要62
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。不吉利的数字为所有含有4或62的号码。例如:62315 73418 88914都属于不吉利号码。但是,61152虽然含有6和2,但...原创 2020-03-16 21:42:41 · 170 阅读 · 0 评论 -
HDOJ2059龟兔赛跑(DP)
Problem Description比赛是设在一条笔直的道路上,长度为L米,规则很简单,谁先到达终点谁就算获胜。乌龟不惜花下血本买了电动车。这辆车在有电的情况下能够以VT1 m/s的速度“飞驰”,可惜电池容量有限,每次充满电最多只能行驶C米的距离,以后就只能用脚来蹬了,乌龟用脚蹬时的速度为VT2 m/s。乌龟在跑道上修建了很多很多(N个)的供电站,供自己给电动车充电。其中,每次充电需要花费T...原创 2020-03-20 18:07:45 · 267 阅读 · 0 评论 -
HDOJ2086 递推
Problem Description有如下方程:Ai = (Ai-1 + Ai+1)/2 - Ci (i = 1, 2, 3, … n).若给出A0, An+1, 和 C1, C2, …Cn.请编程计算A1 = ?Input输入包括多个测试实例。对于每个实例,首先是一个正整数n,(n <= 3000); 然后是2个数a0, an+1.接下来的n行每行有一个数ci(i = 1, ...原创 2020-03-16 17:27:32 · 212 阅读 · 0 评论 -
HDOJ2082母函数
Problem Description 假设有x1个字母A, x2个字母B,… x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,… 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。(组成的单词与排列顺序无关,比如ACM与CM...原创 2020-03-22 22:03:24 · 336 阅读 · 0 评论 -
HDOJ2062子序列
Problem Description Consider the aggregate An= { 1, 2, …, n }. For example, A1={1}, A3={1,2,3}. A subset sequence is defined as a array of a non-empty subset. Sort all the subset sequece of An in lexi...原创 2020-03-22 11:56:36 · 217 阅读 · 0 评论 -
HDOJ 2064 2077另类汉诺塔
Problem Description汉诺塔III规则:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。汉诺塔IV规则:允许最大的盘子放到最上面,(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。Input输入数据的第一行是一个数据T,表示有T组数据。每组数据有一个正整数n(1 <= n <= ...原创 2020-03-13 20:16:02 · 345 阅读 · 0 评论 -
HDOJ2093考试排名
Problem Description C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,...原创 2020-03-24 22:06:24 · 121 阅读 · 0 评论 -
HDOJ 2063 二部图配对
Problem Description 过山车的每一排只有两个座位,每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?Input 输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的...原创 2020-03-10 20:10:34 · 169 阅读 · 0 评论 -
HDOJ 2028 n个数的最小公倍数
两个数a,b求最小公倍数的办法是先用辗转相除法求最大公约数c,然后ab/c即为最小公倍数。求n个数(a,b,c,d…)的最小公倍数时应该先求出a,b的最小公倍数x,在求出x与c的最小公倍数,如此循环。#include <iostream>#include<cstdio>ing namespace std;int gcd(int x, int y){ if...原创 2020-03-04 20:05:47 · 167 阅读 · 0 评论 -
HDOJ2067 卡特兰数
Problem Description 从n*n的棋盘起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?Input 每次输入一个数n(1<=n<=35),当n等于-1时结束输入。Output 对于每个输入数据输出路径数,具体格式看Sample。Sample Input1312-1Sa...原创 2020-03-11 20:46:21 · 229 阅读 · 0 评论 -
HDOJ 2036多边形面积
Input输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2… xn, yn),为了简化问题,这里的所有坐标都用整数表示。输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。Output对于每个测试实例,请输...原创 2020-03-07 15:18:10 · 144 阅读 · 0 评论 -
HDOJ 2056 相交矩形的面积
Problem Description Given two rectangles and the coordinates of two points on the diagonals of each rectangle,you have to calculate the area of the intersected part of two rectangles. its sides are p...原创 2020-03-07 20:27:02 · 170 阅读 · 0 评论 -
HDOJ 2068错排+组合
Problem Description今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;…可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我...原创 2020-03-12 16:42:20 · 184 阅读 · 0 评论