关于数组

83 阅读1分钟

二分查找

经典题目:有很多,懒得举例子了

  • 直接说结论,二分查找这个思想是经常出现的,如果出现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
  • 滑动窗口三要素
  1. 窗口内是什么
  2. 如何移动窗口初始位置
  3. 如何移动窗口结束位置
  • 于是,我们的老朋友,双指针又来了。只要窗口内的值>= target,就移动窗口初始位置,并且记得把窗口内的值减小
  • 初始位置left只负责移动然后减小要被淘汰的值即可,增加窗口内的值靠right移动就行
  • Integer.MAX_VALUE挺实用的,就是有一个结果你得用它跟别的数来回比较才能出来,但是你又找不到合适的具体的值,那么,如果所求result是比较下的较小值,可以刚开始设它的默认值为Integer.MAX_VALUE。

螺旋矩阵II

题目:59

  • 纯纯的考验代码逻辑能力
  • 这种涉及到循环的或者看起来麻烦的,就更要在变换中寻找定量了。即作为螺旋矩阵,确定每个方向的循环一次走多少步。这里可以以矩阵的四角为分界点,然后开始四次循环,四次循环为一圈
  • 一圈解决后,再去找要走多少圈才可以走完全部矩阵。loop < n / 2。可以光看左上角的循环区域,发现从行数看,只有 n / 2那样。