代码随想录算法训练营第二天 | 977 有序数组的平方、209 长度最小的子数组、59 螺旋矩阵II

训练营第二天,今天的题相对昨天会更有难度一些,今天也暴露了我基本功不足的问题,希望继续努力可以弥补一些。

977 有序数组的平方

题解及想法

方法一,暴力破解法

直接遍历一遍,在原有数值上进行平方,如何进行排序

    class Solution {
        public int[] sortedSquares(int[] nums) {
            for(int i = 0; i < nums.length; i++){
                nums[i] = nums[i] * nums[i];
            }
            Arrays.sort(nums);

            return nums;
        }
    }

方法二

通过双指针进行操作,一个指向开始,一个指向结尾,因为原数组是 非递减顺序 排序的,所以克根据两个指针指向的数组的平方进行比较,大的就存到新数组中,然后数值中数值大的指针向中间走一步,继续比较

class Solution {
        public int[] sortedSquares(int[] nums) {
            int l = 0;
            int r = nums.length - 1;
            int t = nums.length - 1; //作为新数组的指针
            int[] a = new int[nums.length];
            while (l <= r){
                if(nums[l] * nums[l] <= nums[r] * nums[r]){
                    a[t--] = nums[r] * nums[r];
                    r--;
                }else{
                    a[t--] = nums[l] * nums[l];
                    l++;
                }
            }
            return a;
        }
    }

209 长度最小的子数组

题解及想法

本题采用的是滑动窗口的思想,首先明确窗口内是大于等于target 的范围,在这个范围内进行滑动,注意for循环指的是窗口的终止位置,通过while不断调整起始位置

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int start = 0;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for(int end = 0; end < nums.length; end++){
            sum += nums[end];
            while(sum >= target){
                result = Math.min(result,end - start + 1);
                sum -= nums[start];
                start++;
            }
        }
        if(result == Integer.MAX_VALUE){
            return 0;
        }
        return result;
    }
}

59 螺旋矩阵II

题解及想法

本题主要是考察循环边界的理解,本题中我们循环每一条边都遵循左闭右开的思想,就可以保证每一条边都是同一个范围

首先明确while的循环次数,也就是n/2次,然后明确从左到右、从上到下、从右到左、从下到上的边界,也就是从这一条边的开头到结尾的前一个,保证左闭右开,依次进行循环。特别要注意,如果n为奇数,需要额外补上中间的值。

class Solution {
    public int[][] generateMatrix(int n) {
        int x = 0, y = 0;  //每循环一圈的起始位置
        int offset = 1; //矩阵行和列边界值的控制变量
        int num = 1;
        int[][] result = new int[n][n];
        int i,j;
        int loop = 0;
        while( loop++ < n / 2 ){
            for(j = y; j < n - offset; j++){ //上
                result[x][j] = num++;
            }
            for(i = x; i < n - offset; i++){ //右
                result[i][j] = num++;
            }
            for(; j > y; j--){ //下 j已经到达最下
                result[i][j] = num++;
            }
            for(; i > x; i--){ //左
                result[i][j] = num++;
            }
            offset++;
            x++;
            y++;
        }
        if(n % 2 == 1){
            result[x][y] = num;
        }
        return result;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值