- 博客(29)
- 收藏
- 关注
原创 LeetCode第八天 利用排序搞事情
排序复杂度的取舍一般来说要避免排序,因为排序复杂度一般从O(nlgn)起步,偶尔O(n)。基本扼杀降低复杂度的可能性。事情分两面,对于暴力复杂度大于n平方的算法来说,排序反而有可能将整个算法拉到接近排序复杂度的情况。举例 – 3Sum Closest思路对于三个数字的和,暴力求解的算法复杂度为n的三次方使用排序可以使算法降低到至少n的平方将三个数字的和转化为 一个数字...
2018-07-21 10:38:05
196
原创 LeetCode动态规划第七天:Is Subsequence & Perfect Squares
换了作息,第一天感觉还行。继续努力。392. Is Subsequence思路 两个指针分别从字符串从前向后移动,进行匹配。比较好奇的是follow up中的想法,当有大量的小字符串的匹配问题。在交流的过程中提到了ac自动机和kmp算法,但和题目略有不同。一种待深究的思路是,将小字符串做成前缀树。代码class Solution {public: boo...
2018-06-29 22:20:46
235
原创 LeetCode动态规划第六天:Predict the Winner
懒得补了,每天坚持。想要写好代码,首先多写代码。486. Predict the Winner思路 一开始是误解了题目,以为拿到最大数字就赢了,然后发现完全不是那么回事。言归正传,虽然最后返回的是bool,dp过程的状态量仍然需要是一个数字。需要对题目的需求进行放大,得出一个包含结果的状态量。 参考了别人的解法,核心状态量为当前数组中先手可以比后手多得多少分,例如dp...
2018-05-07 23:04:19
260
原创 LeetCode动态规划第五天(补):Range Sum Query 2D
慢慢感觉速度提上来了,但是往往解法不够好,继续思考。304. Range Sum Query 2D - Immutable思路一 对matrix从左向右,从上向下累加,建立二维数组用来储存当前位置的和。当方形求和,对于每一行只需要右边界元素减去左边界之前一个元素即可。注意边界情况。代码class NumMatrix {public: NumM...
2018-04-30 18:07:56
210
原创 LeetCode动态规划第四天(补):Coin Change & Maximal Square
最近刷题有点恶心了,应该是低效思考时间过多,时间跨度大但是效果低下导致的惩罚效应。想题目的时候尽量保持好的状态。322. Coin Change思路一 没有很好的分辨出暴力法和bottom-up在复杂度上的差异,使用递归强行暴力,超时。其中还有想过用贪婪算法,尽可能使用较大的货币,但后来给出反例[1, 3, 11, 12] 15导致贪心失败。 复杂度差异:暴力方法...
2018-04-30 12:04:20
187
原创 LeetCode动态规划第三天(补):Best Time to Buy and Sell Stock with Transaction Fee & 2 Keys Keyboard
前段时间连续工作加上连续大强度锻炼,有点颓了,几乎丧失了斗志。注意矫枉过正,注意不走极端。714. Best Time to Buy and Sell Stock with Transaction Fee第一思路(废弃) 最近有个倾向就是硬套动态规划模板,作茧自缚,算是刷题的弊端。一开始思路是找合适的节点把数组割裂开来,将数组的长度缩小来动态规划。但是,无论是最高点和最低点,或...
2018-04-30 00:47:43
184
原创 LeetCode动态规划第二天+: Count Numbers with Unique Digits
今天打球未遂,再加睡眠不足,简直身体精神双重刺激,可以算得上是苦心志劳体肤了。鼓掌。357. Count Numbers with Unique Digits思路 先给个差评,直接莽出了最优解,只有阶乘部分勉强算是dp,几乎没有什么价值。基本上算是一个全排列的想法,懒得多说,直接上代码。 PS:几百年第一次击败了100%,呵呵。代码class S...
2018-04-26 07:41:41
185
原创 LeetCode动态规划第二天: Maximum Length of Pair Chain&Integer Break
昨天被brick wall带错了路子花了太久时间,今天先补上昨天的缺口。646. Maximum Length of Pair Chain思路 一开始尝试使用动态规划,核心在于每一个链条尾部的数字,决定了后面可以选如何的链。然而直接用动态规划,复杂度过高,想不出优化方法就搁浅了。翻了一下算法书,发现这道题目就是任务调度的一个变种,几乎就是贪心的典型例子。先根据后面的值升序排...
2018-04-25 07:59:46
186
原创 LeetCode动态规划第一天: Brick Wall
话说自从找完工作,整个人瞬间咸鱼了,最近才缓过来。看到Leetcode 800+题目真是心灰意冷,但即使这样,也不能够停下脚步了。 目前先找一个专题往死里怼,以期断其一指。先拿动态规划开刀。554. Brick Wall 第一思路 墙的每一行相当于一个整数集合,通过元素依次相加得到不同的和。最优化结果即某一个数字可以由最多的行累加得到。砍掉末尾一行,来得到一个优化子结构。...
2018-04-24 23:44:55
222
原创 第十天 构造函数,拷贝构造函数,析构函数的调用
碰到这三种函数的调用总是头昏,就在VS上写了代码实测一下:#include using namespace std;class Myclass{public: Myclass() { cout << "1"; } Myclass(Myclass &temp) { cout << "2"; } Myclass& operator= (Myclass temp)
2016-08-14 13:37:13
378
原创 第九天 判断二叉搜索树
这道题花了非常多的时间,得到一个宝贵教训,不用使用还没熟练掌握的方法。一开始贪图递归,然后卡在递归的边界条件上面。回头看来,使用递归的算法框架应该简单一下,方便使用者了解思路。 思路:需要判断左右子树是否BST以及根节点的值判断两部分,前者可用递归,后者利用递归遍历法计算最大最小值。 心得:不要轻易使用递归,除非你已经想的足够清楚了。/*struct TreeNode {
2016-08-12 23:17:56
408
原创 第九天 输出单层结点
很明显使用的广度优先的方法,需要注意的就是广度实现本身。另外实现的过程中暴露了链表建立的问题:需要两个节点变量来生成链表,仅一个节点(仅对我而言)无法实现连接与数值的更新。 由于前文树的遍历提到了这种方法,这里不再详述直接贴代码:/*struct TreeNode { int val; struct TreeNode *left; struct
2016-08-12 14:20:30
268
原创 第八天 有向路径检查
题目中数据结构下一点的指针,让我想到了广度优先的思路。大致想法:1. 从任一个点出发,找路径,有向共两次; 2. 用队列的思想,不断把新邻居压人; 3. 注意哪些点已经访问过了,避免环以及提高效率; 4. 注意边界情况。/*struct UndirectedGraphNode { int label; vector neighbors; UndirectedGra
2016-08-12 00:01:08
394
原创 第八天 平衡二叉树
这一章卡了我好久,一开始想了一个线性时间利用广度遍历的方法求得叶节点深度的方法,然后发现深度和高度没有什么联系,duang~自己对于递归也不够精通,所以只在看懂别人代码之后,自己重写一遍而已。亮点:引用的使用,if语句顺序的讲究。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNod
2016-08-11 20:47:42
255
原创 第七天 树的遍历
最近真是各种事情缠绕在一起,一直不敢挥霍时间刷题,惭愧惭愧。 像链表一样,在练习树的算法之前先开一章,打好基础,主要是遍历的方法:前中后序遍历,非递归版本,广度(层次)遍历。PS:深度遍历暂缺,另外后序的非递归版本copy别人的方法需要巩固。 偷个懒,一股脑全部贴上来:#include #include #include #include
2016-08-07 20:00:16
383
5
原创 第六天 用两个栈实现队列+双栈排序+猫狗收容所
最近由于写论文的原因,刷题的频率相对下降。为了节约时间,一般题目只有自己代码,不满意的题目会贴别人优秀代码。用两个栈实现队列和双栈排序想法大致相同,有点像插入排序,每次通过在两个栈之间相互传输保证相对顺序,并在适当地方插入新值。第一题class Solution{public: void push(int node) { if (stack1.em
2016-07-31 12:19:42
495
原创 第五天 集合栈
实现功能没有复杂的算法,只是细节要注意即可。教训:1. 最后一次出循环之后的操作; 2. 思路正确的情况下要抠细节。class SetOfStacks {public: // 第一个栈对应于第一个vector vector > setOfStacks(vector > ope, int size) { // write code here
2016-07-27 21:11:17
224
原创 第五天 链式A+B +回文链表
算是洗刷了前面第二天的那道题目。几个问题:1. 注意对于链表节点重新赋值,需要将上一节点连过来; 2. 注意NULL,注意NULL,注意NULL。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {}};*/clas
2016-07-27 20:09:42
266
原创 第五天 访问单个节点的删除+链表分割
取next之前判断指针非空,取next之前判断指针非空,取next之前判断指针非空,重要的事情说三遍。下面说题目,第一题思路就是在保持内存的情况下替换对应值即可,比较容易;第二题思路则是拿两个指针来记录小的部分和大的部分,然后连起来。注意链表尾节点的next定义为NULL。另:第二题在思路不变的情况下,可以缩减代码长度。对于未定义指针可以先赋一个结构体,来避免NULL的尴尬。可以适当增加变
2016-07-27 19:09:00
426
原创 第五天 链表中倒数第k个结点
单链表对于我来说还是理论大于实现,趁这次机会掌握一下,包括创建,遍历以及逆序。思路:1. 顺序下去,维持一个大小为k的矩阵,到结尾处输出矩阵第一个元素; 2. 逆序(需要两次,否则最后输出的是修改过的指针);3. 野生大神的解法,用两个指针相隔k-1距离顺序一遍搞定。上自己的解法:class Solution {public: ListNode* FindKthToT
2016-07-27 08:39:42
324
原创 第四天 翻转子串
题目描述假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。给定两个字符串s1,s2,请返回bool值代表s2是否由s1旋转而成。字符串中字符为英文字母和空格,区分大小写,字符串长度小于等于1000。测试样例:"Hello world",
2016-07-26 18:36:00
279
原创 第四天 清除行列
题目描述请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。给定一个MxN的int[][]矩阵(C++中为vector)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector),保证n小于等于300,矩阵中的元素为int范围内。测试样例:[[1,2,3],[0,1,2],[0,0,1]]返回:[[0,0,3],[0,0,0
2016-07-26 16:09:20
269
原创 第四天 像素翻转
题目描述有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,
2016-07-26 15:41:31
347
原创 第四天 基本字符串压缩
题目描述利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。测试样例"aabc
2016-07-26 11:59:59
234
原创 第三天 确定两串乱序同构
题目描述给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。测试样例:"This is nowcoder","is This nowcoder"
2016-07-23 16:44:24
281
原创 第三天 原串翻转
咳咳,陪女朋友出去玩了一天,断了更...本题出自金典第二题,讲道理比较简单,但是在阅读了别人分享的代码之后,看到一些新的知识所以记录一下。先上自己无聊的代码class Reverse {public: string reverseString(string iniString) { // write code here for(int
2016-07-23 12:02:35
252
原创 第二天 确定字符互异
题目出自程序员面试金典。看到这道题直接跳出来了两个想法:1. 暴力不是很复杂; 2. Hash/Map之流的(违反题目要求)。习惯性先写了暴力方法(内心OS:竟然没有超过时间)class Different {public: bool checkDifferent(string iniString) { for (int i = 0; i
2016-07-20 20:02:02
522
原创 第一天 Add Two Numbers(链表加法)
这是leetcode第二题,对链表的知识基础有一定要求。暂时自己写不出来,先完全解析别人的代码。1. 先排除极端情况,简化后续 if(l1 == NULL && l2) return l2; if(l1 && l2 == NULL) return l1; if(l1 == NULL && l2 == NULL) return NULL;2. p1,p2为了避免对原输入的影响;hea
2016-07-19 20:59:09
684
原创 第一天 最长回文字符串(可间断)
题目出自腾讯2017的实习编程第一题。有问题的点:1. 子字符串如何取出;2. 指针的移动方法;3. 递归或者动态规划。有意思的点:1. 类似二进制的枚举法;2. string赋值的技巧。尝试用暴力法求解,但因时间复杂过高未能通过样例。#include #include #include #include using namespace std;int isPalind
2016-07-19 13:49:34
298
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人