![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
OJ
文章平均质量分 52
lemnHacker
这个作者很懒,什么都没留下…
展开
-
九度OJ 题目1080:进制转换
题目描述:将M进制的数X转换为N进制的数输出。输入:输入的第一行包括两个整数:M和N(2下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。输出:输出X的N进制表示的数。样例输入:16 10F样例输出:15本题考查大数处理。将一个M进制的大数D用N进制来表示,显然先要原创 2015-03-15 00:02:00 · 372 阅读 · 0 评论 -
1106. Lowest Price in Supply Chain (25)
PAT上一道题目。原题题意是给定供应商到零售商的供应树结构,每经过一级供应商价格都会提高百分之r,初始供应商提供的价格为p,求最终到达零售商的最低价格,及最低零售商的个数。实际上就是求到达叶子节点的最短路径。深度优先搜索可以解决,但要求正确剪枝并且记录最短路径个数,容易超时。采用广度优先反而更快更简洁,因为最短路径的叶节点肯定在同一层上,记录个数也方便。代码如下:// 1106. Lowest Pr原创 2015-12-23 21:25:20 · 920 阅读 · 0 评论 -
1107. Social Clusters (30)
PAT上一道题目,题意为一群人,其中有相同兴趣的人可以构成一个社交群体,求可以构成的社交群体个数和各个群体的人数。本题其实就是做一次并查集即可,有相同兴趣爱好的人之间有关联,这两个人各自所在的社交群体因为这两个人有相同兴趣爱好而可以合并为一个更大的社交群体。在社群合并的时候注意社群人数累加即可。代码如下:// 1107. Social Clusters (30).cpp : 定义控制台应用程序的入口原创 2015-12-23 21:59:37 · 1850 阅读 · 0 评论 -
1003. Universal Travel Sites (35)
本题是PAT上顶级一道题目,考察的知识点其实只有一个,最大流问题。用基于广度优先搜索的Edmonds-Karp算法求解。题目意思就是说求解最多能从地球站发送出去的最大人数,在到达目的星球(MAR)上途径每一个行星(不包括MAR)上都没有收留多余游客的能力,到达的游客必须运送出去。那么可以将EAR视为源点s,MAR视为汇点,是一个单源点单汇点的最大流问题。代码如下:// 1003.cpp : 定义控制原创 2015-12-26 23:54:24 · 5622 阅读 · 0 评论 -
Permutation II
本题就是个简单的动态规划题目。首先将nums排序,使得相同的数字近邻。 以dp[i]表示包含nums[0~i]的所有元素的排列。那么: dp[i+1]的计算如下: 1)当nums[i+1]!=nums[i]时,对于dp[i]中的每一个排列,将nums[i+1]插入到第0~i位置,每次插入到一个位置时,得到的新排列时dp[i+1]中的一个排列; 2)当nums[i+1]=nums[i]时,对于原创 2016-04-07 15:03:25 · 376 阅读 · 0 评论 -
N-Queens
本题是八皇后问题的拓展,八皇后问题解法是一个经典的回溯算法。实际上是一个深度优先算法。在一个N*N的棋盘上,每一行有且仅有一个皇后,所以N个皇后的坐标可以用一个N元的容器vector<int> colms(n)存放,其中第i行上的皇后的列位置是colms[i]。然后我们深度优先的依次找到满足要求的这n个colms。当我们进行到第r行时,首先在第r行寻找一列位置c,使得在该位置放置皇后后,与之前0~r原创 2016-04-07 16:52:09 · 250 阅读 · 0 评论 -
72. Edit Distance
leetcode上一个题目。本题可以用动态规划求解。如果已知有word1的前i个字符的字符串转化成word2的前j个字符的字符串需要的最少操作数是dp[i][j],现在考虑dp[i][j+1], 当第j+1个字符是insert操作过来的,那么dp[i][j+1]=dp[i][j]+1; 当第j+1个字符是由word1的第i个字符replace(此时word[i]1!=word2[j+1])时,d原创 2016-04-07 20:02:19 · 174 阅读 · 0 评论 -
73. Set Matrix Zeroes
本题很简单,先遍历一次矩阵,采用第一行和第一列记录那些会变成0的行和列。比如第i行会变成0,那么就将matrix[0][i]设为0.显然首先就要判断第一行和第一列是否会变成0.然后第二次遍历第一行和第一列,将相应的行和列设为0,最后判断是否将 第一行和第一列设置0.代码如下:int minDistance(string word1,string word2){ int len1=word1原创 2016-04-07 20:29:46 · 178 阅读 · 0 评论 -
76. Minimum Window Substring
本题考查动态规划。定义字符串s的前i个字符组成的子串s[0~i]能够包含t的最短窗长是dp[i]。那么dp[i+1]的值如下: 如果最短窗的右边界不是i+1,那么显然dp[i+1]=dp[i]; 如果最短窗的右边界是i+1,那么先就算出最左边界k,则dp[i+1]=i+1-k+1; 显然最短窗长应该是dp[i+1] = min(dp[i],i-k+2)。 问题在于,如何计算k。k的计算也可以原创 2016-04-07 23:29:44 · 236 阅读 · 0 评论 -
189. Rotate Array
本题有多种解法,但是找到简单的解法其实并不是很简单,额,我自己就花了不少时间。。。。以下有三种解法: 解法一,考虑每k个位置的数互换顺序,可得到如下解法。 void rotate(vector<int>& nums, int k) { if(nums.empty()||k==0) return; int n = nums.size(); k %原创 2016-04-13 14:24:42 · 238 阅读 · 0 评论 -
[leetcode]319. Bulb Switcher
考虑第n个灯的最终状态。显然,在第i轮,只要i是n的因子,包括n,都会改变第n个bulb的状态。当bulb的改变次数(因子个数)为偶数时,灯为开,否则,灯为灭。另外考虑n的一个因子p,对应的另一个因子q=n/p显然也是n的因子。也就是说,当p!=q时因子是成对出现的。那么显然,如果n=p^2,那么n的因子个数为奇数个,否则为偶数个。最终n个灯中,只有i为完全平方数的等bulb(i)会开,所以一共有s原创 2016-04-13 20:53:05 · 256 阅读 · 0 评论 -
318. Maximum Product of Word Lengths
Int类型数字4字节,32位。将字符a~z映射到低26位,那么显然,可以将一个words[i]根据所包含的字符映射到一个int数字上,若两个words[i],words[j]包含相同的字符,那么二者对应的int数的&操作必然不为0。class Solution { int bitMap(string a) { int ret = 0; for(int原创 2016-04-13 21:56:01 · 209 阅读 · 0 评论 -
[leetcode]328. Odd Even Linked List
首先找到链表的首尾节点s,e,然后用p将s~e之间的偶数节点拆下来并且插入链表末端即可。 ListNode* oddEvenList(ListNode* head) { if(head==NULL||head->next==NULL||head->next->next==NULL) return head; ListNode *p = head->next,*q原创 2016-04-13 22:14:09 · 294 阅读 · 0 评论 -
[leetcode]337. House Robber III
采用深度优先搜索,定义一个函数DFS,函数通过引用返回两个值,rob root节点能够得到的最大金钱r1,以及不rob root节点能够得到的最大金钱r2。代码如下: void DFS(TreeNode* root,int &r1,int &r2) { int lr1=0,lr2=0,rr1=0,rr2=0; if(root->left!=NULL) D原创 2016-04-13 22:44:42 · 219 阅读 · 0 评论 -
[leetcode]117. Populating Next Right Pointers in Each Node II
注意一个事实:到根节点的左子节点的next要么指向根节点的右子节点(右子节点不为空),要么就指向根节点的next(或者next的next)节点p,直到该p节点具有下一代的节点。也就是说,将每一层的next链上的节点视为兄弟关系,那么子辈的兄弟必然是父辈兄弟的子辈。基于以上事实,采用DFS,注意右子树比左子树优先搜索到,因为左子树的next要用到右子树的next链信息。代码如下: void co原创 2016-04-14 16:13:46 · 446 阅读 · 0 评论 -
[leetcode]309. Best Time to Buy and Sell Stock with Cooldown
本题采用动态规划做法。 对于某天i,有三种状态:不持有状态,持有状态,卖出状态,在三种状态下的最大收益是dp[i][0~2]。 为何将卖出状态从不持有状态中分离出来,是因为卖出状态过后,下一天不可能是持有状态,也就考虑到卖出后不能接着进行买入操作。 那么显然: dp[0][0]=dp[0][2]=0,dp[0][1] = -prices[0]; 先考虑dp[i][0],第i天不持有,那么第i原创 2016-04-13 23:59:36 · 280 阅读 · 0 评论 -
316. Remove Duplicate Letters
我一直以为本题复杂度要求为O(n),实际上,解法复杂度为O(n*n)的代码也可AC。 代码如下:char* removeDuplicateLetters(char* s) { char *ret = (*char) malloc(sizeof(char)*27); int counts[26] = {0}; bool used[26] = { 0}; int len原创 2016-04-15 13:09:59 · 268 阅读 · 0 评论 -
1105. Spiral Matrix (25)
本题为pat上一道题目,题意很简单,将一个数组元素按照从大到小的顺序顺时针存放在一个行数和列数之差最小的矩阵中,矩阵行数大于列数。本题处理过程很简单,首先判断是在顺时针的哪个时段(t=?),然后填写到对应一个位置,再判断下一个位置并相应的时段。代码如下:#include<iostream>#include<vector>#include<math.h>#include<algorithm>u原创 2015-12-23 21:00:03 · 782 阅读 · 0 评论 -
1104. Sum of Number Segments
PAT甲级一道题目。举几个例子,大概归纳一下就可知道数组的第i个元素要计算i*(n-i)次,如此说来程序就很简单了://#include<iostream>#include<stdio.h>//using namespace std;int main(){ int n; //cin>>n; scanf("%d",&n); double ans=0; f原创 2015-12-23 20:33:11 · 428 阅读 · 0 评论 -
1008. Airline Routes (35)
PAT上的一道题,题目意思是给定一个有向图,判断给定两个顶点间是否有回路。若两个顶点在同一个强连通图上,那么他们之间肯定是有回路的。之前没有遇到过计算强连通图分支的问题。计算一个有向图的强连通图分支的方法是进行两次深度优先遍历。第一次在原图上进行深度优先遍历。第二次在原图的反向图上进行深度优先遍历。 深度优先遍历的方法: 一个顶点有相关的3个变量f(访问该顶点结束时间:即从该节点向原创 2015-12-21 00:16:56 · 634 阅读 · 0 评论 -
九度OJ 题目1044:Pre-Post
考察递归思想和前序遍历与后序遍历的元素序列之间的关系。// 1044.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include#includeusing namespace std;int cid[26][2]; //将字符映射到0~25,然后将他们在s1,s2中的下标分别记录在数组中string原创 2015-03-14 21:57:21 · 365 阅读 · 0 评论 -
1001. Battle Over Cities - Hard Version (35)
It is vitally important to have all the cities connected by highways in a war. If a city is conquered by the enemy, all the highways from/toward that city will be closed. To keep the rest of the citie原创 2015-03-11 19:26:44 · 5112 阅读 · 0 评论 -
PAT. 1002. Business (35)
As the manager of your company, you have to carefully consider, for each project, the time taken to finish it, the deadline, and the profit you can gain, in order to decide if your group should take t原创 2015-03-13 20:39:51 · 1772 阅读 · 0 评论 -
题目1503:二叉搜索树与双向链表
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。输入:输入可能包含多个测试样例。对于每个测试案例,输入的第一行为一个数n(0接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。输出:对应每个测试案例,输出将二叉搜索树转换原创 2015-05-18 12:23:38 · 478 阅读 · 0 评论 -
【九度】题目1348:数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。输入:每个测试案例包括两行:第一行包含一个整数n,表示数组中的元素个数。其中1 第二行包含n个整数,每个数组均为int类型。输出:对应每个测试案例,输出一个整数,表示数组中的逆序对的总数。样例输入:47 5 6 4原创 2015-05-19 01:08:00 · 611 阅读 · 0 评论 -
【九度】题目1554:区间问题
题目描述:给定一个数组,判断数组内是否存在一个连续区间,使其和恰好等于给定整数k。输入:输入包含多组测试用例,每组测试用例由一个整数n(1接下去一行为n个整数,描述这个数组,整数绝对值不大于100。最后一行为一个整数k(大小在int范围内)。输出:对于每组测试用例,若存在这个连续区间,输出其开始和结束的位置,s,e(s 若原创 2015-05-25 23:18:04 · 1127 阅读 · 0 评论 -
【leetcode】Distinct Subsequences
原题地址https://leetcode.com/problems/distinct-subsequences/。本题显然要用到动态规划。先假设各个T中的字符互不相同。定义vector cur,cur[i]表示模板T的从头到第i个字符为止的这部分在S中的子序列个数。从左往右依次扫描S的每一个字符,当扫到第j个字符时,首先在T中找到对应的字符为第i个位置的T[i],显然T[i]的数目增加原创 2015-08-25 23:37:23 · 240 阅读 · 0 评论 -
【leetcode】Flatten Binary Tree to Linked List,初次使用指针的指针的引用的方法
原题地址https://leetcode.com/problems/flatten-binary-tree-to-linked-list/。本题尝试用引用获得一个指针的指针。代码如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left原创 2015-08-25 22:14:03 · 292 阅读 · 0 评论 -
[leetcode]First Missing Positive
原题连接https://leetcode.com/problems/first-missing-positive/.如果数组是有序的话,那么显然可以在o(n)时间要求和常数空间要求内完成。但如果是乱序的,对数组排序至少需要o(nlogn)的时间,不可取。但如果可以在o(n)时间内使得数组的第k个位置,如果k+1是数组的一个元素,那么将k+1存放在数组的第k个位置上,即nums[k-=k+1。那原创 2015-07-22 17:55:49 · 312 阅读 · 0 评论 -
【leetcode】Subsets II
原题意思很简单,求一个可能包含重复元素的集合的所有子集。先从简单着手,假设是简单集合,不包含重复元素。将集合B的元素编号为a1,a2,...,an,那么B的所有的子集构成的集合S(n)=S(n-1)+{ an+ A,for every set A in S(n-1)};n=0,S(0) = { [ ]};n= 1,S(1) = { [ ] ,{a1} };...当存原创 2015-08-03 18:37:28 · 224 阅读 · 0 评论 -
【leetcode】Gray Code
leetcode上的原题,地址https://leetcode.com/problems/gray-code/先写几个看看:n=1, 返回[0,1];n=2,返回[0,1,3,2];n=3,返回[0,1,3,2,6,7,5,4];由上可以看出:A(n+1) = A(n) + reverse(A(n))+2^(n+1);如:[0,1,3,2]=[0,1,2+1,2+0原创 2015-08-03 17:46:32 · 281 阅读 · 0 评论 -
【leetcode】Linked List Cycle II,判断链表是否有环
本题意思是无修改的判断一个链表是否具有环,并且返回环的初始节点,否则返回NULL。一种方法是对已经访问到的节点设置一些标志,比如将next指针指向某一个特定节点,或者其他方法等。这样的问题是会对链表进行修改。另一种方法是采用两个指针在链表上滑动,一个指针每次只滑过一个节点,另一个指针每次滑过两个节点,连个指针同时从起点开始滑动。可以证明,当存在环时,两个指针会在某次相遇在同一个节点,否则,快的指针原创 2015-09-07 20:27:24 · 478 阅读 · 0 评论 -
【leetcode】Majority Element II,Majority element algorithm
My idea comes from Majority Vote algroithm(http://www.cs.utexas.edu/~moore/best-ideas/mjrty/index.html) .Now we vote two numbers simultaneously. if the next number is differents from them both.then原创 2015-09-08 17:04:14 · 322 阅读 · 0 评论 -
1007. Red-black Tree (35)
本题是PAT上的一道题目。题目意思是给定一颗红黑树内部节点个数n,求这样的红黑树的个数。本题可以采用动态规划法做。首先定义一种特殊的树,红树,红树的根节点为红节点,根节点的左右两个子树均为红黑树,且各节点的黑高定义与红黑树一致,那么该红树的左孩子的黑高与右孩子的黑高相同,红树的根节点的黑高也即其孩子的黑高。 那么显然,一颗n个内部节点黑高为h的红树在p,q划分下(左子树p内部节点,右子树q内部节点原创 2015-12-29 18:47:54 · 992 阅读 · 0 评论 -
1004. To Buy or Not to Buy - Hard Version (35)
本题是PAT上的一道题目。采用的是深度优先的暴力法,并适当剪枝,目前没有找到更好的方法。将每一个bread string,用一个向量vector表示:[a0,a1,a2,…,an-3,an-2,an-1]。其中a0-an-3是Eva needed colors,an-2是extra,an-1是miss。 剪枝思路: 对于不包含Eva想要的color的bread string是无用的,直接去掉,不原创 2015-12-02 20:43:27 · 1342 阅读 · 0 评论 -
1009. Triple Inversions (35)
PAT上一道题目。题意是在一个1~n组成的n元数组A中,计算三元逆序的个数(满足i<j<k,Ai>Aj>Ak的(Ai,Aj,Ak))的个数。 所有的三元逆序对,从中间数Aj考虑。对每一个数Ap,如果知道在p之前比Ap大的个数leftBigger以及在p 之后比Ap小的个数rightSmall。那么以Aj作为中间数的三元逆序对个数为leftBigger*rightSmall。对每一个p,计算以Ap为原创 2015-12-19 17:51:40 · 1069 阅读 · 0 评论 -
数组两端取数
这是完美世界的一道笔试题,题目详述忘记了,大概记得这么一个意思: 给定一个数组nums[0~n-1];A和B分变从数组的两端交替循环选择数据,累加到自身的积分中,并且A和B都采用最优策略选择数据,求最终A和B的积分。首先考虑考虑用深度优先算法,定义一个函数int func(int st,int len),这个函数的功能是仅考虑在数组剩余区间为[st,en]时刻及之后(之前各自的积分都重置为0),A原创 2016-09-20 12:34:18 · 3283 阅读 · 0 评论