【两个月算法速成】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条连续的地址空间组成