- 博客(21)
- 资源 (2)
- 收藏
- 关注
原创 单调栈 (Leetcode 503)
题目:给定一个循环数组,求数组中每一个元素的下一个更大的元素。若元素为数组中最大的,则输出-1。例:给定数组[1,2,1],则结果为[2,-1,2]。思路:采用单调栈来解决,时间复杂度为O(n)。单调栈存储的是数组中元素的下标。单调栈的更新如下:栈为空,则直接将元素下标压入栈内;若要入栈的元素不大于栈顶元素,则元素直接入栈;若要入栈的元素大于栈顶元素,则把栈顶元素出栈,并且其下一个更大的元素就是要入栈的元素。以样例为例:设返回结果为ans,给定数组为nums单调栈更新过程:1. push
2021-03-06 22:13:45
140
原创 环形链表 II
题意:给定一个链表,若该链表为环形链表,则返回链表入环的第一个节点,若不是,则返回NULL。思路:假设链表为环形链表,设两个指针:快指针与慢指针。其中,快指针一次走两个节点,慢指针一次走一个节点。因为链表为环形链表,则两个指针一定会在某一刻于环形中的某一点相遇。则有如下示意图:其中,a为链表头节点到环形入口的距离,b为环形入口到相遇点的距离,c为相遇点到环形入口的距离。设相遇时,慢指针走了n次环形,快指针走了m次环形。则慢指针总共走了,快指针走了。因为快指针一次走的距离是慢指针的两倍
2020-10-25 16:10:21
74
原创 颜色分类(双“指针”)
题意:给定一个只包含0,1,2的数组,要求对这数组进行排序思路:一个简单的思路:记录数组中0,1,2的个数,之后对数组进行重新赋值。该思路需要两次遍历。下面介绍一下只进行一次遍历的方法:采用双“指针”,设立变量index0和index2记录0和2的位置。即区间都为0,区间都为2,其中len为数组长度。index0的初值为0,index2的初值为len-1先做如下设定:输入数组nums,当前遍历位置nums[i]解题策略如下:1.nums[i] == 0时,nums[i]与nums[ind
2020-10-07 17:07:28
135
原创 树中距离之和(树形dp)
题意:给定一个含有n个节点的树,求各个点到其他点的距离之和。返回一个vector。举例:假设返回vectot<int> ans。则ans[0] = dist(0,1) + dist(0,2) + ...+ dist(0,n)思路:树状dp。设数组dp[],dp[root]为其他点到点root的距离之和;数组nodes[],nodes[root]为以点root为根节点的节点数。则更新公式为:dp[u] =...
2020-10-07 14:24:37
744
原创 四数之和
题意:给定一个有N个元素的整数数组nums和一个整数target。求数组中四个元素之和等于target的组合,要求组合不能重复。思路:首先对数组进行排序,因为要保证组合不能重复。设立四个“指针”a,b,c,d。其中a,b固定在数组最开头,c = b+1,d位于数组末尾,之后通过移动指针c和d使得nums[a],nums[b],nums[c],nums[d]之和等于target。当指针c和d重合时表明,以nums[a],nums[b]为开头的组合已经寻找完毕。所以移动指针b,当指针b移至末尾再移动指.
2020-10-06 15:22:52
91
原创 hdu 2102
题意:题干讲得很明确了。思路:简单的BFS。我做的时候在两个地方被坑了。一,走到传送门也需要花费时间。二,花费的时间小于等于限制时间即可,而不需要小于他。AC代码:#include<bits/stdc++.h>using namespace std;int n,m,r;char mmap[2][12][12];bool vis[2][12][12];int cx...
2018-10-13 11:48:46
157
原创 hdu 3567(八数码问题 双向BFS)
题意:八数码问题,给了状态A,B,求A->B的最少变化次数,有多组最少则输出字典序最小的。可以先做这道http://acm.hdu.edu.cn/showproblem.php?pid=1043。这道简单些。思路:双向BFS,同时从起点,终点进行搜索。这里以一个整数来表示路径。从起点搜索,路径表示为从终点搜索,路径表示为这里i的取值为0~3,即空白点的不同移动所代表的数字,s...
2018-10-12 20:38:07
1402
1
原创 hdu 1043 (八数码)
题意:解决八数码问题。八数码问题:在一个3X3的矩阵里分别有数字1到8和一个空白位,用x表示空白位。初始时,给出矩阵的状态,如题意2 3 4 1 5 x 7 6 8,问是否可以通过若干操作将矩阵变为1 2 3 4 6 7 5 8 x,并输出具体的操作路径。思路:这里将某一个时刻的状态转换为一个整数来表示,之后进行BFS并打表。起点为1 2 3 4 6 7 5 8 x,记录从起点出发可以到达...
2018-10-10 21:51:59
170
原创 洛谷 p3951
题意:给两个互质的数n,m,问最大的不能表示的数是多少。思路:做的时候列了几个式子,看了下结果猜会不会是n*m-n-m。但不知道原因,查了下网上的博客才弄清楚。有式子ax+by=c。若a,b互质,c为正整数,则必有整数解。所以在题目中不能表示的数的情况出现在非正整数解的时候,因为没有负数个硬币嘛。假设a>b,则max(ax+by)时,y=-1,此时就变为求ax-b的最大值。假设x>...
2018-09-29 18:46:25
155
原创 hdu 5521 最短路
题目大意:有n个点,两个人,一个人在点1,另一个人在点n。他们两人要见上一面。两人同时出发,问在哪相遇花费时间最短,答案可能有多个。先到的人可以等后到的人。思路:拿到这题很自然的就想到迪杰斯特拉求最短路,从1到n求一遍求得数组dist_1,再从n到1求一遍得数组dist_n。最后遍历一下两个数组找到min(max(dist_1[i],dist_n[i]))。但这样做会T。为什么呢?看题目的输入...
2018-09-20 19:21:58
126
原创 优化的迪杰斯特拉
迪杰斯特拉大家肯定不陌生,求单源最短路的基础算法。但这算法时间复杂度不尽人意,O(N^2)。所以大佬们就将它给优化了一下,可以达到O(Nlog(N))。那么怎么优化呢?首先我们来看看迪杰斯特拉是怎么求最短路的。这个算法是通过维护一个点集然后再贪心进行求解的。简单来说,就是我已知了n个点,这n个点在目前为止是我知道的可以从源点到达的点,当然它们的路径在目前来说是最优的,那我就通过遍历这些点,来扩展这...
2018-05-14 23:15:17
245
原创 Graham扫描法求凸包
今天刚看了Graham扫描法求凸包,就赶紧来记录一下。以下都是我的个人理解,不保证绝对正确,若是有错误希望大佬能指出,共同进步!什么是凸包:给了有n个点的点集,让你求出这点集中的m个点,这m个点可以将其余点都包围起来。求法:先找出左下角的点,就是纵坐标最小的点,若纵坐标相等则取横坐标最小的点。之后将这个点(x0,y0)分别与其他点相连。之后按射线与y=x0所行成的夹角大小排序(升序)。这里要是有图...
2018-05-14 22:54:38
162
原创 hdu 4292
题意:你到了一家餐厅做兼职。现在有N个人,F种食物,D种饮料,然后一个人只吃特定的食物和饮料,满足不了他他就离开。然后现在要求最多能满足几人。思路:其实这题和奶牛那道题基本一样,建图方式也是一样的。将人分为两个点,添加一个源点s和一个汇点t。然后这样子建图。s->f->n->n*->d->t。其中f表示的是食物,n表示的是人,n*表示的也是人,d表示的是饮料。建完图求...
2018-05-08 23:20:45
134
原创 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 B题Goldbach
题意:题意很简单,就是让你验证哥德巴赫猜想——一个大于2的偶数可以分解成两个素数之和。但数据量有点大2^63。思路:预处理一个10^6以内的素数表,然后循环判断n-prime[i]是否为素数,如果为素数则打印退出循环即可。当然,这不可能用普通的判素数的方法,这里用到了一个Miller-Rabin质数测试。我觉得我能理有限也讲不清楚,所以我贴hihocoder上的讲(ti)解(mu),讲得很详细
2018-04-24 17:15:26
440
原创 poj3436 ACM Computer Factory
题意:一家公司有n台机器用来生产电脑,一个电脑有p个部分,要p个部分同时存在才算生产完成。对于一个机器,有三组数据描述。数据一:一个整数Q,用来表示机器一个小时能够加工多少电脑,数据二:(输入)p个整数,整数取值为0,1,2,用以表示电脑需满足这一组条件才能被这台机器加工。0表示这个部分不能有,1表示这个部分必须有,2表示这个部分可有可无。数据三:(输出)p个整数,整数取值为0,1。用以表示输出的...
2018-04-16 23:40:48
96
原创 [kuangbin带你飞]专题十四 数论基础——个人总结
最近做了数论基础的专题,没做完,剩了七道。以后再补吧!!!(标红即没做)A - Bi-shoe and Phi-shoe题意:一个人要去买竹子,长为n的竹子对应一个数f(n),f(n)的值为1到n-1之间的与n互质的个数。之后给出m个数ai,对应的这个人买m根竹子长为bi,要满足f(bi)>=ai,并且SUM(ai)最小。输出SUM(ai)。思路:这里我们注意,虽然f(n...
2018-04-03 23:14:49
366
原创 最小生成树&&次最小生成树
这几天玩得比较多,就写了几道最小生成树的题,都是模板题就不贴了,写下最小生成树和次最小生成树的原理,加深加深印象吧。最小生成树网络上也有很多博客讲这个,我就按我自己的想法讲。1.普里姆算法。这个算法有贪心的思想。每次都选取最短的一条边,之后更新dist[]数组和visited[]数组。数组代表的含义:map[][]记录各个点之间的距离,dist[]记录此时到各个点的最短距离,v
2017-08-05 09:25:27
417
原创 总结2
这十来天练了些简单DP和简单搜索。基础搜索poj 1321 DFS,设一个数组re[]记录某一列是否放过棋子,然后再for()循环一行一行判断是否可以放棋子。poj 2251 BFS,这个看好题意就好了,一个简单的BFS,只不过每一步有6种可能。hdoj 2717 BFS,一步有三种可能,进一步,退一步,或者跨越一倍的步数。不过这题有一个要注意的地方,就是初始时,人和牛就在同一个位
2017-07-27 00:18:48
167
原创 小结1
hdoj 2136 直接素数筛法,再打表hdoj 1087 求最大递增数列和,可以不连续。hdoj 1003 动态规划hdoj 1203 背包hdoj 2062 写写他的情况,找出规律。然后一步一步地将集合缩小hdoj 1728 一开始设了一个字符变量表示他的方向,最后爆内存了。再网上看的题解。设了一个vis[][]数组,记录在某地转了几
2017-07-14 23:30:46
117
原创 小结
1.字符串的最小表示 eg: hdoj 2609 2.汉诺塔相关1) hdoj 1995 假设有n个盘,则第n个盘只移1次,第n-1个盘要移2次(n-1个盘移到B时和n-1个盘移到C时)....由此可得公式:S(i)=2^(n-I)2) hdoj 1997 汉诺塔的移动:将n-1个盘借助C移到B,再将第n个盘移到C,再借助A将n-1个盘移到C。所以第n个盘不是在A就是在C,而由
2017-07-08 16:46:59
168
转载 hdoj 2089
原文:http://www.cnblogs.com/wenruo/p/4725005.html#include<stdio.h>int dp[10][10];//1到10位数内满足条件的个数void inti(){ int i,j,k; dp[0][0]=1; for(i=1;i<=7;i++) for(j=0;j<10;j++)...
2017-07-07 21:08:54
252
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人