目录
977. 有序数组的平方
题目链接
思路:
代码 :
209. 长度最小的子数组
题目链接
思路
代码
59. 螺旋矩阵 II
题目链接
思路
代码
总结
977. 有序数组的平方
题目链接
力扣
思路:
双指针法
因为数组是非递减的,所以它的平方最大值不是在最左边,就是在最右边。因此我们可以使用双指针法,一个指向数组第一个位置,一个指向最后一个位置,然后比较指针所在位置的数的平方大小。另外新开辟一个数组,并且index指向新开辟数组的最后一位。将大的数放在index上
代码 :
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int i = 0,j = nums.length -1;
int index = nums.length -1;
while (i <= j){
if (nums[i] * nums[i] < nums[j] * nums[j]){
res[index] =nums[j] * nums[j];
j--;
}else {
res[index] = nums[i] * nums[i];
i++;
}
index --;
}
return res;
}
}
209. 长度最小的子数组
题目链接
力扣
思路
滑动窗口
使用两个指针,我们可以把它看做是一个窗口,每次往窗口中添加元素来判断是否满足。其实我们可以逆向思维,先固定一个窗口大小比如 leng,然后遍历数组,查看在数组中 leng 个元素长度的和是否有满足的,如果没有满足的我们就扩大窗口的大小继续查找,如果有满足的我们就记录下窗口的大小 leng,因为这个 leng 不一定是最小的,我们要缩小窗口的大小再继续找
代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int slow = 0, fast = 0;
int res = Integer.MAX_VALUE;
int sum = nums[0];
while (slow <= fast){
if (sum >= target){
res = Math.min(res,fast - slow +1 );
sum -= nums[slow];
slow ++;
}else{
fast ++;
if (fast >= nums.length){
break;
}
sum += nums[fast];
}
}
return res == Integer.MAX_VALUE ? 0:res;
}
}
59. 螺旋矩阵 II
题目链接
力扣
思路
不涉及算法,但是考察模拟的能力,要保持循环变量的一致性
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
代码
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0;
int[][] res = new int[n][n];
int start = 0;
int count = 1;
int i, j;
while (loop++ < n / 2) {
for (j = start; j < n - loop; j++) {
res[start][j] = count++;
}
for (i = start; i < n - loop; i++) {
res[i][j] = count++;
}
for (; j >= loop; j--) {
res[i][j] = count++;
}
for (; i >= loop; i--) {
res[i][j] = count++;
}
start++;
}
if (n % 2 == 1) {
res[start][start] = count;
}
return res;
}
}
总结
数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力
也就是说,想法很简单,但实现起来 可能就不是那么回事了。
首先要知道数组在内存中的存储方式,这样才能真正理解数组相关的面试题
数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标下对应的数据。
需要两点注意的是
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
数组的元素是不能删的,只能覆盖。
二维数组的内存空间是n条连续的地址空间组成