1.学习目标
1.按照如下类型来刷题:数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
2.动手用多种语言来进行写题,并要有自己的代码模板。
3.总结程序员简历技巧。
2.数组
2.1 题目
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
进阶:
如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。
2.2 暴力法
很容易想到两重循环,外循环控制连续子数组首位下标,内循环负责累加,以及记录当前数组的长度。
每轮内循环与target进行判断,如果是大于就结束内循环,并和最小数组的长度进行比较,如果小于就进行更新。如果是小于就继续,直到内循环遍历到最后一位,如果此时依旧小于target,则直接结束外循环,否则继续。
然后不断移动连续数组首位的下标,直到外循环结束。然后返回最小数组长度即可。
时间复杂度为O(n^2),空间复杂度为O(1)。
稍微做点优化,如果某个数大于target直接返回1。
2.3 滑动窗口
虽然写着滑动窗口,但本质上就是双指针的一个特殊应用,而且不训练的话也难想到,即使想到有时也很难动笔写出来,至少最初的我就是这么想的。
(1)“滑动”与“窗口”
个人理解:
我是这么思考的,所谓的窗口表示的使用两个指针之间的数组。滑动,表示的是这个数组会随指针的移动而“滑动”。
(2)实现方法
用我自己的语言来描述,先构成一个“合格”的窗口,合格的窗口要求两指针间的数组之和大于target。
“滑动”的原则:如果窗口内数组之和大于target则移动左指针以缩小数组和,否则就移动右指针来增加窗口中数组和。
每次达到“合格”状态的时候,就记录当前的长度,并且与最小长度进行对比,如果更小则进行更新,否则继续。
直到最后,右指针到达最右端,且滑动窗口中数组之和小于target,那么就结束循环,此时的最小长度是输出值。
时间复杂度:O(n)
空间复杂度:O(1)
(3)模板
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0; // 滑动窗口数值之和
int i = 0; // 滑动窗口起始位置
int subLength = 0; // 滑动窗口的长度
for (int j = 0; j < nums.size(); j++) {
sum += nums[j];
// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
while (sum >= s) {
subLength = (j - i + 1); // 取子序列的长度
result = result < subLength ? result : subLength;
sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return result == INT32_MAX ? 0 : result;
}
};
3. 数组2
3.1题目
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
3.2思考
这道题没有什么算法,但对严谨性有极大的要求,有一种一看就会一写就跪的感觉。
我的思路十分的简单,就是设置四角坐标,然后四种方向的画矩阵,但实际做的时候还是会有很多的细节要处理,暂时先看下别人大佬的处理方法吧。
https://mp.weixin.qq.com/s/KTPhaeqxbMK9CxHUUgFDmg
据说,面试会经常考这道题目,我还是仔细的研究一下吧!!!!
4. 闲聊
投了简历,模拟了一轮行测,刷了下题目,等待了下初试成绩,一天就这么没了。我螺旋矩阵还是自己在钻研一下吧,感觉细节挺多的,昨天自己还写了下二分查找的思考,感觉仔细思考问题还真的收获不少。
今天算是把数组篇简单的过了下,明天开始链表吧,其实我还想把排序算法以及多线程复习一下的。