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

977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

本题转换下思路,可以转化为两个数组(正数部分和负数部分)的归并问题,有了这个思路整体就比较简单了。首先准备两个指针,分别指向负数部分末尾和正数部位起始位置,然后从两个方向开始归并,下面看代码

class Solution {
    public int[] sortedSquares(int[] nums) {
        int index1 = 0;
        while (index1< nums.length && nums[index1] < 0) index1 ++;
        int index2 = nums.length - 1;
        while (index2 > -1 && nums[index2] >= 0) index2 --;
        int[] nums2 = new int[nums.length];

        for (int i = 0; index1 < nums.length || index2 > -1 ; i++) {
            if(index2 == -1){
                nums2[i] = nums[index1] * nums[index1];
                index1 ++;
            }
            else if(index1 == nums2.length){
                nums2[i] = nums[index2] * nums[index2];
                index2--;
            }
            else {
                if(-nums[index2] <= nums[index1]){
                    nums2[i] = nums[index2] * nums[index2];
                    index2--;
                }else {
                    nums2[i] = nums[index1] * nums[index1];
                    index1 ++;
                }
            }
        }
        return nums2;
    }
}

27. 移除元素

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

 本题是滑动数组的典型题目,滑动数组也是双指针的一种,通过slowIndex和fastIndex指针标记出符合题目条件的子数组部分。一般fastIndex负责扫描收集数组,slowIndex负责根据筛选条件将不符合条件的数组成员排除。在本题中,fastIndex向后扫描,双指针中包含的数字和大于等于target,并同时将slowIndex也向数组尾部移动(移动时保证和大于taget)。

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

59.螺旋矩阵II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

 如下图:

 看图分析,无法简单通过两次循环打印出所需矩阵,两层打印只能做到按行或列输出。看图分析,容易看出来,螺旋矩阵实际是按“层”遍历的,一圈即为一层,每层有四个不同的状态,其中每层的“末尾”需要特殊处理,根据分析,我们不难写出代码

 

class Solution {
    public int[][] generateMatrix(int n) {
        int [][] result = new int[n][n];
        int count = n - 1;
        int mark = 2; //由上图容易看出,数组其实是从2开始打印的
        int x = 0;  //横坐标    
        int y = 0;  //纵坐标
        int temp ; //标记是否到每层的末尾
        int reset = 1;  //末尾的值需要特殊处理
        for (int i = count; i > 0 ; i-=2) {
            temp = i * 4; //计数
            for (int j = 0; j < 4; j++) {
                   //四个值对应x,y的四种变化
                for (int k = 0; k < i; k++) {
                    temp --;
                    if(temp == 0){
                        result[x-1][y] = reset;
                        reset = mark++;
                        break;
                    }
                    if(j == 0) y++;
                    if(j == 1) x++;
                    if(j == 2) y--;
                    if(j == 3) x--;
                    result [x][y] = mark++;
                }
            }
            y++;
        }
        //n为奇数需要特殊处理
        if(n % 2 != 0){
            result [n/2][n/2] = n*n;
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值