一、数组理论
数组是存放在连续内存空间上的相同类型数据的集合,数组内存空间的地址是连续的
二、二分查找
前提条件:数组为有序数组,数组中无重复元素
循环不变量规则:
1.定义target在一个左闭右闭的区间里,[left,right]
while(left <= right)要使用 <=,因为left == right 是有意义的,所以使用 <=
if (nums[middle] > target) right 赋值 middle - 1
2.定义target在一个左闭右开的区间里,[left,right)
while(left < right), 因为left == right 在区间[left,right] 是没有意义的
if(nums[middle] > target) right 更新为 middle
3.定义中间数 int mid = l + (r-l)/2;
三、双指针
用于移除元素 又不占用新的空间
四、滑动窗口
不断调节子序列的起始位置和终止位置,从而得出我们要想的结果。
1.窗口内是什么?
2.如何移动窗口的起始位置
3.如何移动窗口的结束位置
五、螺旋矩阵
给定一个正整数 n,生成一个包含 1 到 $n^2$ 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
// 循环次数
int loop = n / 2;
// 定义每次循环起始位置
int startX = 0;
int startY = 0;
// 定义偏移量
int offset = 1;
// 定义填充数字
int count = 1;
// 定义中间位置
int mid = n / 2;
while (loop > 0) {
int i = startX;
int j = startY;
// 模拟上侧从左到右
for (; j<startY + n -offset; ++j) {
res[startX][j] = count++;
}
// 模拟右侧从上到下
for (; i<startX + n -offset; ++i) {
res[i][j] = count++;
}
// 模拟下侧从右到左
for (; j > startY; j--) {
res[i][j] = count++;
}
// 模拟左侧从下到上
for (; i > startX; i--) {
res[i][j] = count++;
}
loop--;
startX += 1;
startY += 1;
offset += 2;
}
if (n % 2 == 1) {
res[mid][mid] = count;
}
return res;
}
}