对于今天的数组专题一共刷了3题
有两题是自己可以暴力做,但是想不到更好的方法。
那么就来总结一下刷题收获吧
首先第一题:将所有数平方并且排序
用到了双指针,一个在左边,一个在右边
每一次循环进行一次平方,并且比较,如果左边的大就把最大值赋值给新数组,并且left++
然后开始第二次的循环
如果右边的大那么把右边的赋值给新数组,并且right--
注意循环的条件是left<=right
下面是第二题:涉及到滑动窗口
开始是语言创建两个指针i,j
通过for循环i先不动,j不断往上加 直到sum>=目标值
然后开始while循环,i网上加j不动,直到sum<=目标值
在while中保存最短的值
退出while循环后j继续网上加直到再次满足while的情况,或者到达最右边
第三题:螺旋矩阵
这题刚开始看到还是有点害怕的,但是这不太应该
其实硬写还是可以写出来的,就是胆子太小了,不相信自己,所以又看了题解
本质思想:循环条件的选择,循环不变量原则,新位置的开始值
这道题目:
定义一个新位置的开始值很重要(也就是转完一圈后的新位置值)也就是对角线从(0,0)到(1,1).......等
这个新位置每次新循环开始都要给他赋值
然后就是循环不变量,这里选择了左闭右开的原则,只要一直遵循这个原则还是很好写的。
接下来就是循环条件的选择,在这道题目中,i为行,j为列
所以在转第一笔的时候:i不变,j++,并且j < n - offset (offset是控制循环位置的值,每次加1)
在转第二笔的时候:由于j已经加到了最右边,所以j不需要变。i++,i<n - offset
在转第三笔的时候:i和j都到达了顶,所以不需要赋值,直接j--,并且j > startx
在转第四笔的时候:j位置到了左下,i往上升,所以i--,i > starty
四笔转完,一圈也就转完了,下面直接改新坐标i和j的
然后开始新的一圈
直到n/2次结束
还需要判断是否为寄,为奇数那么就最后把count赋值到中间位置就可以啦
反思:两天做了五道题目 感觉自己的胆子太小了,大脑没有创新,老是想着暴力做题
总结:
数组和指针关系很大,我们可以灵活利用双指针来操作数组里面的元素。
然后在螺旋矩阵中我发现了初始化的重要新和变量定义的重要性
在敲代码的时候要注意一个点,我是程序的创新这,我需要管理的是程序运行的过程,我把程序给他,他帮我计算。所以在一个程序中,需要我计算的数量越少越好。可以用变量来完成我需要操控的这个动作。
最后是说说收获吧:
首先双指针的滑动窗口真的很巧妙
结论:在用来判断一个连续的范围时可以外面一层for里面一层while这样可以让后面的数字追回来,而且计算复杂度不会加太多(前提是:连续片段)
循环不变量一定要记住,在做题目的过程中不要老是修改自己的想法。坚定一个算下去
还有就是初始化还是很重要的。变量记得写