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

977.有序数组的平方

力扣题目链接(opens new window)

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

示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]

示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]

思路:本题关键在于理解双指针思想。

本题如果只用一个while循环写的话,要写的条件和语句比较冗杂,不如新建一个数组存放新数据,代码既简单由方便理解。

 

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] num = new int[nums.length];
        int last = nums.length-1;
        int start = 0;
        int last1 = nums.length-1;
        while(last1>=0){
            if( nums[last]* nums[last]>=nums[start]*nums[start]){
                num[last1] = nums[last]* nums[last];
                last1--;
                last--;}
            else {
                num[last1] = nums[start]*nums[start];
                last1--;
                start++;
            }
        } 
        return num;
    }
}

209.长度最小的子数组

力扣题目链接(opens new window)

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

思路:滑动窗口,不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

思路类似双指针但是有个地方需要注意,相加值大于目标值时不能用if,要用while循环找出最小大于目标值的长度,举个例子,target=20,nums = {1,1,1,1,1,1000,11,1},不难看出使用if进行判断不能满足要求。

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

相关题目推荐

59.螺旋矩阵II

力扣题目链接(opens new window)

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

示例:

输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

思路:本题不难主要是注意for循环时的判定条件要相同,也就是 “循环不变量”,具体表现为每次循环时留出的距离。其次循环方向搞清楚,n是否为奇数,做起来就不会有太大的问题。

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

类似题目

  • 54.螺旋矩阵
  • 剑指Offer 29.顺时针打印矩阵
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值