数组的物理结构
所有对数组的操作,都要从了解数组的结构开始。
- 数组在内存空间中的地址是连续的,其中每个数据占据的空间是相同的。
- 数组下标都是从0开始。(大多数对数组的操作都是基于下标)
因为数组在内存空间的地址是连续的,所以在增添和删除元素时,就难免要移动其他元素。
注意:数组元素的删除操作,本质上不是删除,而是覆盖。
题型总结
这里对题目的详细流程不做赘述,只回顾一遍不同题型中的重难点。
二分法
题型详解:leetcode704、二分搜索
重难点:
- 区间定义:不同的区间定义下,边界条件也会不同——循环的终止条件、左右指针的移动。
- 中间位置的计算:在C++中,为了防止两数之和太大导致大数越界的问题,应该采用公式:
(right-left)/2+left
来计算mid- 区间移动:数组存在目标值的情况下。
当nums[mid] < target时,表明目标值在[mid+1,right]区间;
当nums[mid] > target时,表明目标值在[left,mid-1]区间
双指针法
题型详解:leetcode27、移除元素
重难点:
- 移除操作:数组中的元素不能删除,对元素的移除操作,本质上是覆盖。
- 指针用途:定义一个快指针,用来搜索符合要求的元素;
定义一个慢指针,用来把快指针搜索到符合要求的元素覆盖到原数组中。
滑动窗口
题型详解:leetcode209、长度最小的子数组
重难点:
- 确定窗口起始位置和终止位置的移动:
起始位置:在子数组的总和满足条件,起始位置向右移动,直到不满足条件时。
终止位置:在不满足条件时,终止位置向右移动,直到满足条件。- 初始位置移动和子数组总和变化应匹配:在初始位置移动后,当前子数组的总和也应变化。
模拟
题型详解:leetcode59、螺旋矩阵II
重难点:
- 明确每一圈循环赋值的初始位置:
第一圈:(0,0);第二圈:(1,1);…以此类推- 确定需要进行几圈循环赋值:
n/2
- 确定n为奇数和偶数时的不同情况:
n为奇数时:需要单独给中间元素赋值,mid = n / 2
n为偶数时:循环赋值即可。
4.确定每轮循环应该遍历的边长:
第一轮:n - 1;第二轮:n - 2;…以此类推