您现在的位置是:首页 >技术杂谈 >【两个月算法速成】day02网站首页技术杂谈

【两个月算法速成】day02

weixin_57597001 2023-06-07 11:30:35
简介【两个月算法速成】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条连续的地址空间组成

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。