数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标下对应的数据。(查找快 修改慢)
需要两点注意的是
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
数组经典题目解决方法
二分法:前提数组为有序数组,同时题目还强调数组中无重复元素 (注意区间)
- 暴力解法时间复杂度:O(n)
- 二分法时间复杂度:O(logn)
双指针法
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 暴力解法时间复杂度:O(n^2)
- 双指针时间复杂度:O(n)
滑动窗口
本题介绍了数组操作中的另一个重要思想:滑动窗口。
- 暴力解法时间复杂度:O(n^2)
- 滑动窗口时间复杂度:O(n)
本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。
滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。
704.二分查找
思路:左右指针对半取 左闭右闭 <= right= mid -1 左闭右开无= right= mid
35.搜索插入位置
思路:二分法 左闭右闭 <= right= mid -1 return right+1 左闭右开 < right= mid -1 return right
27.移除元素
思路:双指针法-快慢指针 快指针先行 当当前元素等于目标值 慢指针不动 快指针前移
当当前元素不等于目标值 将快指针赋值给慢指针
双指针-相向指针(left right) 左边找等于目标值的,右边找不等于目标值的,各自找到目标值将不等于目标值元素覆盖左边等于目标值元素
977.有序数平方
思路:相向指针(left right) 有序数平方最大值一定在两步边 创建一个新的数组存储新的结果集合比较两边指针元素平方大小放入结果数组
209.长度最小子数组(滑动窗口)
思路:双指针构造结果数组,大于左指针向前,小于右指针向前,每次计算一次窗口长度
59.螺旋矩阵 ||
思路:计算循环圈数,奇数最后一位为中间位,每次循环为从左往右,从上往下,从右往左,从下往上画圈,每圈过后offerset+1