2019年5月22日10:50:22
今天最少要做到70题的位置,既然不考研复习,那就写20个题。
考研倒计时
http://www.haomeili.net/DaoJiShi/?key=考研&year=2019
2019年5月7日【KY228】
整个4月一直被毕业论文分散精力
今天开始从新刷题(此外准备二战杭州某校计算机)
然后我突然发现我这1-30个题做的是啥都忘了(╯‵□′)╯︵┻━┻这代码真的都是我写的吗?怎么一个也看不懂啊,这都是啥啊。。。。。
总之,重新开始重新开始。。。。。。
2019年5月20日 【KY 214】
鸽了鸽了,又tj了半个月,21日进行答辩。之后,emmmmm
leetcode 题号 | 算法 | 思路 | 难度 | date |
---|---|---|---|---|
1 | ||||
2 | ||||
3 | ||||
4 | 模拟 | 双数组-找第K大值(Median) | H | |
5 | 字符串 | 最长回文字串(DP 两边扩展 马拉车 暴力) | H | |
6 | 模拟 | 遍历输出 | ||
7 | 数学 | 反转字符串(注意越界情况) | ||
8 | 模拟 | |||
9 | 模拟 | 回文数字 | ||
10 | 字符串 | DP,模拟 | H | |
11 | 两个指针 | 纯暴力不可取 | ||
12 | 字符串 | 论打表的正确姿势 | ||
13 | 字符串 | 论打表的正确姿势 | ||
14 | 字符串 | 最长公共前缀 LCP | https://leetcode-cn.com/articles/longest-common-prefix/ | |
15 | K-sum | 二分框架 | ||
16 | K-sum | 二分框架 | ||
17 | DFS | 逻辑上可以整理成树,所以是DFS | 值得一看 | |
18 | K-sum | 这种题都是二分法框架 | ||
19 | 链表 | 删除指定位置的元素 | 值得一看,没啥难度 | |
20 | STL | |||
21 | 链表 | 链表归并 | ||
22 | DFS | 你还是没做出来 | ||
23 | 链表 | K路归并(分治,最小堆) | 重点研究 | |
24 | 链表 | 相邻链表反转 | ||
25 | 链表 | K组链表反转 | 24升级 H | |
26 | 数组处理 | 一步到位 | ||
27 | 数组处理 | 一步到位 | 26升级 | |
28 | 字符串 | 字符串匹配 | ||
29 | 数学 | 没有乘除号的除法 | 边界条件的控制 H | |
30 | 字符串 | 字符串复杂匹配,要求速度 | H | |
31 | 全排列 | |||
32 | ||||
33 | ||||
34 | ||||
35 | ||||
36 | ||||
37 | ||||
38 | ||||
39 | ||||
40 | 全排列 | DFS | 应该掌握的模板题目 | 2019年5月20日20:32:04 |
41 | unordered_set | 名不副实 | 2019年5月20日21:13:43 | |
42 | DP | 重写 | 2019年5月20日22:22:36 | |
43 | 字符串计算乘法 | 错位相乘 | 套路题 | 2019年5月20日23:01:09 |
44 | 字符串匹配 | DP | 2019年5月20日22:25:53 | |
45 | 跳跃游戏 | 贪心 | 应该掌握的模板题目 | 2019年5月21日09:24:25 |
46 | 全排列系列 | DFS | 必须掌握的一个套路 | |
47 | ||||
函数参数用引用最大的作用——也就是传递参数的内存地址而不是额外创建一个变量。
42 双指针法 和 DP法进行分析。
双指针法的本质是:首先计算最底层的水,然后逐层计算更上层的水的情况。【比较复杂】
DP法:
首先从左到右进行遍历,存储进入dp的是左边的最大值;然后右向左进行遍历,存储的是右边的最大值和左边最大值的较小者,最后就是这个较小值和当前的数值进行比较,如果最值较小者更大,我们就把差值存进去。
http://www.cnblogs.com/grandyang/p/4402392.html
10&&44 字符串匹配问题,第一个应该想到的就是DP【神器级别】【10是正则匹配,而44是wildMatch,两种匹配方式是不一样的】【还是不会写】
43 由字符串表示的数字来计算超出范围的数字,进而表示为字符串输出。
【简单说就是,套路,必须记住】
把乘法转变为错位相加,i和j相乘的结果分别对应i+j和i+j+1的结果。【错位相加】
45 第一感觉是DP,到达每一个位置的最小步数可以构造一个状态转移方程。但是仔细想想并不是一个纯的DP。根据GrandYang的文章,决定采用Greedy方式。
cur当前可以到达的最远位置
pre之前可以到达的最远位置
class Solution {
public:
int jump(vector<int>& nums) {
int cur = 0;//当前可以到达的最远位置
int pre = cur;//上一次可以达到的最远位置
int res = 0;
int n = nums.size();
int i=0;// 把这个东西放到里面就会TLE,因为进行了大量的重复操作。
while(cur < n-1){
res++;
pre = cur;
for(;i<=pre;i++){
cur = max(cur,nums[i]+i);
}
}
return res;
}
};
47 关于全排列,我们应该知道的一点就是,大概有DFS(insert)和 DFS(swap)两种方式来实现你的想法。
48 数学 转置矩阵,对数组的操作。
最容易理解的,就是首先进行矩阵转置【直接交换到对应的位置就行】,交换每一行的顺序情况。
49 字符串聚类,聚类标准就是元素相同。注意,元素的个数也同样重要。
我一开始的想法是哈希表,但是后来发现,你不就是26个字母吗,那还不如创建一个数组,记录你元素出现的个数情况。【此外,这个26字母出现次数的数组可以转变为一个字符串,进而比较统计字符串,统计字符串也要和字符串构建一一对应的映射关系】
【STL】
50 一个数学问题,第一个要注意的就是,如果N是INT_MIN怎么办;第二个就是要注意,构造递归函数来简化计算。
51 N皇后是典型的递归来求解的题目了。
需要一个函数,用于对目标数组判断某行某列的某一个元素是不是符合规定的要求。在实际中就是bool isValid函数。
注意,vector< string > 是有着二维数组的效果的。
而vector< vector< string >>说明最后的可行结果不止一种,也就是不止一个二维数组。
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<string> queens(n,string(n,'.'));
helper(0,queens,res);
return res;
}
void helper(int curRow,vector<string> &queens,vector<vector<string>> &res){
int n = queens.size();
if(curRow==n){
res.push_back(queens);
return;
}
for(int i=0;i<n;i++){
if(isValid(queens,curRow,i)){
queens[curRow][i] = 'Q';
helper(curRow+1,queens,res);
queens[curRow][i] = '.';
}
}
}
//
bool isValid(vector<string>& queens,int row,int col){
//如果同一列有Q就不行
for(int i=0;i<row;i++){
if(queens[i][col]=='Q') return false;
}
//如果斜对角线有Q也行
for(int i=row-1,j=col-1;i>=0&&j>=0;--i,--j){
if(queens[i][j]=='Q') return false;
}
for(int i=row-1,j= col+1;i>=0 && j<queens.size();i--i,++j){
if(queens[i][j]=='Q') return false;
}
return true;
}
};
注意:由于你的目的是进行一个递归的操作,那么你的函数的位置,应该是严格的递归函数。这个递归的情况,跟DFS是一样的,就是要进行恢复,也就是你先前设置为Q的点,要增加一句话来恢复。
2019年6月17日17:08:46