自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Stephen Wong的专栏

让明天把今天记住 不是因为孤独 因为我们追求的专注 不管它起起伏伏

  • 博客(36)
  • 收藏
  • 关注

原创 LeetCode 135. Candy (O(n)时间 O(n)和O(1)空间的两种实现)

贪心算法,从局部最优推广成全局最优。这里介绍O(n)时间 O(n)和O(1)空间的两种实现方法。

2015-02-17 00:14:46 2083

原创 LeetCode 155. Min Stack

相较普通的栈,题目要求多实现一个操作getMin(): 获取栈中最小的元素   我们维护两个栈:普通栈s保存所有元素, 最小栈min_s保存s中的“曾出现过”的最小元素的递减序列。min_s.top()即为getMin()的返回值,标识普通栈s里的最小元素。考虑压栈 3 4 5 2 3 1, 它们有如下表现:push   3 4 5 2 3 1s          3

2015-02-24 10:56:34 1089 3

原创 LeetCode 171. Excel Sheet Column Number

相似题型:LeetCode 168. Excel Sheet Column Title代码:class Solution {public: int titleToNumber(string s) { int ret = 0; for (size_t i = 0; i < s.size(); ++ i) {

2015-02-24 10:42:36 1033

原创 LeetCode 168. Excel Sheet Column Title

相似题型:LeetCode 171. Excel Sheet Column Number代码:class Solution {public: string convertToTitle(int n) { string ret; while (n != 0) { ret.insert(ret.begin(), 'A' + (n-1)%26); n = (n-1) / 26; }

2015-02-24 10:41:36 1245

原创 LeetCode 154. Find Minimum in Rotated Sorted Array II

二分搜索,和LeetCode 153. Find Minimum in Rotated Sorted Array相似。只是在num[begin] == num[mid]时,需要binary_search(++ begin, end, num); 这时仅将begin移进一位,并没有进行二分查找。所以如测试用例为 num = {1, 1, 1, 1, 1, ..., 1}等特殊情况时,最坏情况

2015-02-24 00:05:14 1242

原创 LeetCode 153. Find Minimum in Rotated Sorted Array

二分查找。因为在旋转前的数组是排好序了的,所以当num[begin] > num[mid]时,表示我们要搜寻的最小数字在num[begin, ..., mid]之间;反之,num[begin] 例:考虑num = {5, 6, 7, 1, 2, 3, 4},begin = 0, end = 6, mid = 3num[begin] = 5 > num[m

2015-02-23 23:06:13 975

原创 LeetCode 152. Maximum Product Subarray

动态规划。dp[0][i]: A[0, ..., i-1]的maximum product subarray,dp[1][i]: A[0, ..., i-1)的minimum product subarray.初始化dp[0][0] = dp[1][0] = A[0].递推公式:dp[0][i] = max(dp[0][i-1]*A[i], dp[1][i-1]*A[i])

2015-02-23 19:19:27 845

原创 LeetCode 140. Word Break II (DP+DFS)

直接递归求解TLE(Time Limit Exceeded), 用vector<vector<string>> ret(s.size()+1)保存wordBreak的解MLE(Memory Limit Exceeded),采用DP+DFS通过测试。在LeetCode 139. Word Break的中,用dp[i]标识s.substr(0, i)是否可以由dict里的字符串组成;在此我们用dp[i]标识s.substr(0, i)的workBreak解的最后一个单词的集合。如输入["abcde

2015-02-23 10:39:42 3541 1

原创 LeetCode 139. Word Break

动态规划。dp[i] == true表示s.substr(0, i)可以由dict里的字符串组成;dp[0]初始化为true, dp[1, ..., s.size()]初始化为false.代码:class Solution {public: bool wordBreak(string s, unordered_set &dict) { vec

2015-02-19 22:28:25 952

原创 LeetCode 138. Copy List with Random Pointer

和LeetCode 133. Clone Graph一个意思,深层拷贝意味着,对a进行拷贝,获得b, 使得b的成员变量不仅值与a中对应的成员变量相等,同时它们指向不同的内存空间。维护一张map, 保存已创建好的结点即可。因为题目并不像clone graph一样,本体没有说明label唯一,所以应该用label和next组成的pair来作为map的key;但同时发现本题sample中的label都是唯一的,所以在代码1中,就直接用int label, 作为map的key了。

2015-02-17 13:20:10 764

原创 LeetCode 137. Single Number II

n-1个数字出现3次,1个数字出现1次。位运算,用cnt[32]记录每个位上,二进制'1'出现的次数。1) 假设一个数字7, 它出现3次,那么二进制0000 0000 0000 0000 0000 0000 0000 0111会出现三次,也就是第0, 1, 2位上的二进制'1'会出现3次,那么我们将它%3, 得到的余数为0. 2) 假设一个数字15, 它只出现1次,那么二进

2015-02-17 11:14:50 740

原创 LeetCode 136. Single Number

只有一个数出现基数次(1次),其他数字出现欧数次(2次)异或运算即可。代码:class Solution {public: int singleNumber(int A[], int n) { int ret = 0; for (int i = 0; i < n; ++ i) { ret ^= A[i];

2015-02-17 11:05:41 798

原创 LeetCode 134. Gas Station

初始化起始车站begin和抵达车站end为0, 初始化记录车上还剩的汽油gas_in_car为0,迭代gas.size()次。每次迭代:计算当前所在车站gas[now] - gas[cost], 将差值加入gas_in_car中1) 当gas_in_car小于0时,说明无法从begin抵达end, 将begin前移(-- begin), 继续迭代2) 当gas_in_car大于0时,说明可以从begin抵达end, 将end后移(++ end), 继续迭代迭代gas.size()次后,无论怎样,我

2015-02-16 23:20:54 782

原创 LeetCode 133. Clone Graph

题意为克隆整张图,返回形参“逻辑相等”的结点可通过测试。代码:class Solution {public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if (node == NULL) { return NULL; } aut

2015-02-15 18:48:28 717

原创 LeetCode 132. Palindrome Partitioning II

动态规划。1. palindrome[i][j]==true, 表示s[i, ..., j] (i将其初始化为false. 有动态方程:if (s[i]==s[j] && (j-i<=2 || palindrome[i+1][j-1])){ palindrome[i][j] = true;}2. dp[i]标志子串s.substr(i)的minCuts将其初始

2015-02-15 13:15:05 699

原创 LeetCode 131. Palindrome Partitioning

递归切分回文串即可。代码:class Solution {public: vector> partition(string s) { vector cur; recurse(s, cur); return ret; }private: void recurse(const string& s, vector& cur

2015-02-15 11:26:24 576

原创 LeetCode 130. Surrounded Regions

逆向思维,从边缘的O出发(上下左右四排的O),进行DFS, 将这些'O'可达的所有点'O'都标记为'Z'(包括它们自身也标记为O), 这些'Z'最终都可以保持为'O'不变,而其他点应该都变成'X'. 这样就可以了。

2015-02-15 11:01:12 736

原创 LeetCode 129. Sum Root to Leaf Numbers

代码:class Solution {public: int sumNumbers(TreeNode *root) { ret = 0; foo(root, 0); return ret; } private: void foo(TreeNode* node, int num) { if (node == NUL

2015-02-12 10:44:26 542

原创 LeetCode 128. Longest Consecutive Sequence(nlogn)

题意要求O(n)内解决,看了下别人的题解好像用的是没用过的STL... 但这题即使用排序nlogn来解,也只要十多个毫秒就可以解决,甚至比它们的解法都更省时所以我也不知道它们的方法是不是真的是O(n)的... 感觉没什么意思 就先O(nlogn)解了... 下回再来看它们代码:class Solution {public: int longestConsecut

2015-02-12 10:43:28 694

原创 LeetCode 127. Word Ladder II

感觉思路不像网上一些博主说的那么复杂... 用dis(map<string, int>类型)记录每个单词离start的距离,通过BFS记录每个单词的前继单词paths(map<string, vector<string>>);再通过paths信息从end递归(可以理解为DFS), 求出到end的道路即可。

2015-02-11 19:17:01 796

原创 LeetCode 126. Word Ladder

BFS遍历即可,其中有个trick是dict.insert(end), 将end加入到dict中,这样不用到最后再特判。另外感觉有点赖皮的是:对于每个字符串,每次只变换它个一个字母,看这个新串是否在dict中,这样就可以AC;但如果对于每个字符串,直接去遍历dict中的每个字符串,判断这两个字符串只相差两个字母,那么这样会TLE.个人感觉这完全只是因为case中的字符串比较短,di

2015-02-10 21:52:36 857

原创 九度 题目1014:排名

按总分降序打印过录取线的学生,总分相同时,id小的在前(id升序)。代码:#include #include #include #include using namespace std;struct Student{ Student(const string& _id): id(_id), tot(0) {} string id; int tot;};b

2015-02-05 18:55:42 976

原创 九度 题目1013:开门人和关门人

字符串直接比较即可。偷懒用的sort排序,O(nlogn)的复杂度;若是直接用string存最早到最晚离开的信息,只需要O(n).代码:#include #include #include #include using namespace std;struct Person{ string id; string enter; string leave;}

2015-02-05 17:55:45 878

原创 九度 题目1012:畅通工程 (BFS计算连通分支的个数)

用宽搜(bfs)计算图的连通分支的个数bfs_cnt。需要构建的道路的条数为bfs_cnt - 1代码:#include #include using namespace std;int n, m, bfs_cnt;bool connect[1010][1010];bool vi[1010];queue q;void init(){ for (int i =

2015-02-05 12:35:56 1342

原创 九度 题目1011:最大连续子序列

这题和PAT 1007. Maximum Subsequence Sum一样,只是输入为0时要结束。用动态规划的思想。迭代数组a中的每个数a[i],用cur变量标识从前到a[i](包括a[i])的最大累和。当cur小于零时归零,意味如果这个从前到a[i]为止的子序列包括a[i], 那么必然和小于0, 索性不要考虑这个子序列,从下一处i+1开始重新计算。注意到:1

2015-02-05 12:34:17 1219

原创 九度 题目1010:A + B

处理好字符串即可。代码:#include #include #include using namespace std;map dict;string str;int a, b;void init(){ dict["zero"] = 0; dict["one"] = 1; dict["two"] = 2; dict["three"] = 3; dict["four

2015-02-05 12:29:46 909

原创 PAT 1007. Maximum Subsequence Sum

求最大连续子序列。动态规划的思想。迭代数组a中的每个数a[i],用cur变量标识从前到a[i](包括a[i])的最大累和。当cur小于零时归零,意味如果这个从前到a[i]为止的子序列包括a[i], 那么必然和小于0, 索性不要考虑这个子序列,从下一处i+1开始重新计算。注意到:1. 如果最大连续子序列不唯一,则输出序号i和j最小的那个2. 若所有K个元素都是

2015-02-05 11:06:05 775

原创 九度 题目1009:二叉搜索树 (静态数组构建二叉树\二叉树的数组实现)

题意:给定序列,将序列中的数字一个一个插入到二叉查找树中。问不同的序列,最终生成的二叉查找树是否相同。可以用静态数组构建二叉树。

2015-02-04 11:15:54 1372

原创 九度 题目1008:最短路径问题

dijkstra求最短路,出现相同最短路时取花费最小的那条。代码:#include #include #include #include using namespace std;int n, m;int map[1010][1010];bool vi[1010];int cost[1010][1010];int dis[1010];int price[101

2015-02-04 11:12:30 1355 3

原创 九度 题目1007:奥运排序问题

题意:按国家号,依次输出它们的:“排名:排名方式”这里的排名方式指的即是金牌总数,奖牌总数,金牌人口比例,奖牌人口比例。它们的排名方式分别对应数字1, 2, 3, 4.... 题目说的很模糊。易错的地方:1. 如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.2. 计算比例时应该用double(可以用double保存国家的金牌

2015-02-03 20:57:35 1500

原创 STL: sort

依据http://www.cplusplus.com/reference/algorithm/sort/?kw=sort, 该模板函数可以接收两个或三个参数这里着重介绍第三个参数。第三个参数可以为重载了()操作符的struct类型的对象,或者接收两个参数的函数的函数名。代码(摘自上述链接):#include // std::cout#include // s

2015-02-03 20:50:38 652

原创 九度 题目1006:ZOJ问题

学过了计算理论,回头看这题是更得心应手了很多。记'z'前o的个数为a, 'z'和'j'之间o的个数为b, 'j'之后的o的个数为c.分析文法可以发现,符合文法的字符串将满足:1. b != 02. a * b = c代码:#include #include using namespace std;int main(){ string str; wh

2015-02-03 13:44:53 1350

原创 九度 题目1005:Graduate Admission

和PAT 1080. Graduate Admission (平行志愿模拟题)是一样的:学生总分高的排名在前;总分相同,GE得分高的排名在前;GE相同,则排名相同。不同的是,在九度中“Each input file may contain more than one test case.”所以借用PAT 1080中的代码,在main中加入循环,在循环开始调用init()函数初始化变量。

2015-02-03 12:33:52 940

原创 九度 题目1004:Median

利用给定的s1, s2是递增序列的性质,进行如归并排序(Merge Sort)中的遍历方法,找到第(n+m+1)/2个数即可。代码:#include #include using namespace std;int main(){ int n, m, num; while (cin >> n) { vector s1, s2; for (int i =

2015-02-03 11:48:53 800

原创 九度 题目1003:A+B

代码:#include #include #include using namespace std;inline int string_to_int(const string& str){ int ret; stringstream ss; ss << str; ss >> ret; return ret;}inline string input_filter(c

2015-02-02 11:18:41 849

原创 九度 题目1002:Grading

模拟题。代码:#include #include #include using namespace std;int main(){ float p, t, g1, g2, g3, gj; while (cin >> p >> t >> g1 >> g2 >> g3 >> gj) { if (abs(g1-g2) <= t) { printf("%.1f\n"

2015-02-02 11:16:54 784

空空如也

空空如也

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

TA关注的人

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