代码随想录算法训练营第一天 | 977.有序数组的平方 、 209.长度最小的子数组 、 59.螺旋矩阵II
前言
做完三道算法题 并观看视频和文章进行深度学习, 进行总结数组
一、977.有序数组的平方
题目建议本题关键在于理解双指针思想
视频链接
题目链接
文章链接
暴力解法:利用循环加 sort方法进行解题 时间复杂度:O(n + nlogn)
双指针法:
思路:数组其实是有序的, 只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
如图所示:
时间复杂度: O(n)
第一印象 看到题目第一时间想到的是用双循环 加 冒泡排序的办法…不得不说 还需要提升自己的技术和知识
学习过程看完文章第一时间还有些一知半解,看完视频后基本能够手敲出完整代码
收获进一步加强了双指针法的应用方法
二、209.长度最小的子数组
题目建议本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接
文章链接
视频链接
暴力解法这道题目暴力解法当然是 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。
var minSubArrayLen = function (target, nums) {
let res = Infinity
let sum
let len = 0
let num = nums.length
for (let end = 0; end <= num; end++) {
sum = 0
for (let j = end; j <= num; j++) {
sum += nums[j]
if (sum >= target) {
// console.log(j)
len = j - end + 1
res = res < len ? res : len
// console.log(res)
break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
}
// console.log(sum)
}
}
return res === Infinity ? 0 : res
}
暴力解法在力扣上已经超时了…
滑动窗口法
思路:所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。
如图所示:
实现困难初次接触 只看文章确实有些茫然 需要配合视频一起学习。
收获本质还是配合双指针法 进行进一步的学习 逐渐掌握。
相关题目推荐 904.水果成篮 76.最小覆盖子串
三、59.螺旋矩阵II
题目建议 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
题目链接
文章链接
视频链接
思路:大家还记得我们在这篇文章数组:每次遇到二分法,都是一看就会,一写就废 (opens new window)中讲解了二分法,提到如果要写出正确的二分法一定要坚持循环不变量原则。而求解本题依然是要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
第一印象第一次遇到这种类似画图填充的题目 还有点懵。
收获经过视频和文章的学习后发现 只要能够掌握二分查找 和 区间定义 实现这道题并不困难
总结
数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力。两天学习了四种数组的解题方式,再进行深度复习,相信技术会越来越好!继续加油