> 文章列表 > 【两个月算法速成】day02

【两个月算法速成】day02

【两个月算法速成】day02

目录

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条连续的地址空间组成