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

977.有序数组的平方

思路:双指针从左右两侧向中间迭代,定义一个新数组result(与nums数组长度相同),定义新数组的指针在最右侧(因为平方之后大的数字要放在最右边),比较平方后的元素值大小,如果右侧的元素平方后更大,就将此值放到新数组index的位置,然后index左移一位,同时right也左移一位;同理如果左侧元素平方后更大,同样将该值放到index位置,index左移一位,同时left右移一位。返回result数组。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int[] result = new int[nums.length];//定义一个长度相同的新数组
        int index = result.length - 1;//新数组的指针从右往左更替
        while(left <= right){
            if(nums[left]*nums[left] < nums[right]*nums[right]){
                result[index] = nums[right]*nums[right];
                index--;
                right--;
            }
            else{
                result[index] = nums[left]*nums[left];
                index--;
                left++;
            }
        }
        return result;
    }
}

209.长度最小的子数组

int result = Integer.MAX_VALUE
  • Integer.MAX_VALUE表示:int 数据类型的最大值,即:2147483647
  • Integer.MIN_VALUE表示: int数据类型的最小值,即:-2147483648   

 思路:设置两个指针起始点均为左侧,right先开始移动,此时sum开始累加每个right值,直到sum大于等于target值。说明此子数组的长度符合要求,即right - left + 1;此时需要向右移动left指针,sum值发生改变,即sum = sum - nums[left];然后left++,再回到for循环。

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

59.螺旋矩阵Ⅱ 

思路:绕圈填写,左闭右开(有点乱,需再看)

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] nums = new int[n][n];
        int startX = 0,startY = 0;
        int offset = 1;
        int count = 1;
        int loop = 1;
        int i,j;
        while(loop <= n/2){
            for(j = startY;j < n - offset;j++){
                nums[startX][j] = count++;
            }
            for(i = startX;i < n - offset;i++){
                nums[i][j] = count++;
            }
            for(;j > startY;j--){
                nums[i][j] = count++;
            }
            for(;i > startX;i--){
                nums[i][j] = count++;
            }
            offset++;
            loop++;
            startX++;
            startY++;
        }
        if(n%2 == 1){
            nums[startX][startY] = count;
        }
        return nums;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值