二分查找
经典题目:有很多,懒得举例子了
- 直接说结论,二分查找这个思想是经常出现的,如果出现logN这种时间复杂度,那二分查找大概率是跑不了的
- 思路简单,但是它的难点就是在于扣细节,比如循环条件是 left < right 还是 left <= right。新的left = mid + 1 还是 mid(right同理也是这样)
- 代码随想录里给出的答案是利用不变量原则,中译中就是:选择了怎样的区间,就按照配套的方式决定边界,以下就暂时当作一种固定模板了。
- 第一种:定义target在[left,right]里,那么此时,循环条件就要是while(left <= right) 因为此时两值相等有意义,而确定left就是用 left = mid + 1。right = mid -1。毕竟nums[mid]已经被遗憾退场.jpg了
- 第二种则是target在[left,right)里。此时,left == right在此区间无意义。而确定left时,虽然还是left = mid + 1。但是right 就是 right = mid
移除元素
经典题目:27
- 是的,又是我们的老朋友,双指针
- 毕竟该题的题干里虽然有一段写的让人不知道它在干什么,但是题的意思就是在原本的数组上做到把特定值消除(通过改变数组长度的方式) 那么很简单直白,把特定值都移到后面去然后断尾就行了。
- 不过记得,如果是那种从头尾开始相近的双指针,记得也要先把right指针指到不是val的位置,要不然消除了个寂寞。顺便,这里也用不到交换元素,无脑消除代替就可以了x 直接nums[left] = nums[right]
有序数组的平方
题目:977
- 怎么说呢,简单来说,就是平方然后Arrays.sort
- 不简单来说,好像得用到双指针
- ......只说可以试试让时间复杂度变O(n),没说不能变空间复杂度啊。弄个新的数组,空间大小和原数组一样
- 毕竟越靠近中心越低,所以左右指针从首尾开始,看谁的平方大,就把该数的平方放到答案数组的最后一位,然后逐渐前推,左右指针也逐渐靠近
长度最小的子数组
题目:209
- 滑动窗口desu
- 滑动窗口三要素
- 窗口内是什么
- 如何移动窗口初始位置
- 如何移动窗口结束位置
- 于是,我们的老朋友,双指针又来了。只要窗口内的值>= target,就移动窗口初始位置,并且记得把窗口内的值减小
- 初始位置left只负责移动然后减小要被淘汰的值即可,增加窗口内的值靠right移动就行
- Integer.MAX_VALUE挺实用的,就是有一个结果你得用它跟别的数来回比较才能出来,但是你又找不到合适的具体的值,那么,如果所求result是比较下的较小值,可以刚开始设它的默认值为Integer.MAX_VALUE。
螺旋矩阵II
题目:59
- 纯纯的考验代码逻辑能力
- 这种涉及到循环的或者看起来麻烦的,就更要在变换中寻找定量了。即作为螺旋矩阵,确定每个方向的循环一次走多少步。这里可以以矩阵的四角为分界点,然后开始四次循环,四次循环为一圈
- 一圈解决后,再去找要走多少圈才可以走完全部矩阵。loop < n / 2。可以光看左上角的循环区域,发现从行数看,只有 n / 2那样。