小白视角刷leetcode (977有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵 II)

977 有序数组的平方(简单)


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

 解法一:暴力解法
把数组内的每个内容都直接平方,然后再进行排序Arrays.sort(nums)


class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        for(int i = 0;i <nums.length;i++){
            nums[i] = nums[i] * nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }
}
解法二:双指针
思路:
1.创建双指针,分别指向旧数组的开头和末尾,然后创建一个长度与旧数组相等的新数组,并创建新指针index指向新数组末尾
2.开始循环while(left<=right),判断旧数组的双指针所指向内容平方后的大小,把平方后大的内容添加到新数组的末尾,然后index--
class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length -1;
        int[] res = new int[nums.length];
        int index = nums.length-1;
        while (left <= right){
            if(nums[left]*nums[left] > nums[right]*nums[right]){
                res[index--] = nums[left]*nums[left];
                left++;
            }
            else {
                res[index--] = nums[right]*nums[right];
                right--;
                }
        }
        return res;
    }
​
}
note:
1.创建新数组的同时要新建一个指针并指向新数组的末尾
2.while内要用小于等于,否则会丢掉元素
3.只需要用一个if和else,不需要单独判断nums[left]和nums[right]相等情况,因为旧数组本身就是排序好的数组,当不满足if(nums[left]*nums[left] > nums[right]*nums[right])时,直接把right指向的内容存到index,并且right--就好了

209. 长度最小的子数组(中等)


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

解法一:暴力解法(超时)
    两层for循环,外层i循环,内层j循环;内层循环定义sum负责求和,当sum大于target,求出当前子数组长度(两个指针相减+1)j-i+1;并赋值给res,并在res处进行Math.min判断,因为满足大于target时的子数组可能不唯一,需要取得长度最短的子数组;最后先判断res是否等于最初值,然后返回res。
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int res = Integer.MAX_VALUE;
        for(int i = 0; i < nums.length;i++){
            int sum = 0;
            for(int j = i ; j<nums.length;j++){
                sum += nums[j];
                if(sum>=target){
                    res = Math.min(res,j-i+1);//需要进行min判断,否则会一最后一次大于目标值时的长度res为准
                    break;
                }
            }
        }
        return res==Integer.MAX_VALUE? 0:res;//需要对res是否等于初值进行判断,否则若没有找到大于target的数会返回Max_Value
    }
}
解法二:滑动窗口
    思路:定义left、right两个指针,外层for循环right向前遍历,每遍历一次都需要用sum求和,直到sum > target,计算子数组长度,并向前移动left指针,并计算该滑动窗口的值。其余部分与暴力解法相同
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int res = Integer.MAX_VALUE;
        int left = 0;
        int right = 0;
        int sum = 0;
        for(; right< nums.length;right++){
            sum += nums[right];
            while(sum >= target){
                res = Math.min(res,right-left+1);
                sum -= nums[left++];
            }
        }
        return res==Integer.MAX_VALUE? 0:res;
    }
}

59. 螺旋矩阵 II(中等)


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

​思路:
    1.填充顺序如上图所示,在填充时采取左闭右开原则,保持每个循环的条件相同
    2.需要判断n是奇数偶数,如果是奇数则需要单独填充最中心的内容
    3.需要有loop记录圈数,start代表新的一层循环开始时起始点所在位置
    4.i,j分别记录横纵坐标

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 1;//循环次数
        int count =1;//填充计数
        int start = 0;//每填充完一圈,start会加一,即下次循环会向内走一层
        int i,j;
        int[][] nums = new int[n][n];
        while(loop <= n/2){//要有while判断需要几次循环
            for (j = start ; j < n -loop ; j++){
                nums[start][j]=count++;
            }
            for(i = start ; i < n - loop ; i++){
                nums[i][j] = count++;
            }
            for(; j >= loop ; j--){//左闭右开因此取到等号
                nums[i][j] = count++;
            }
            for( ; i >= loop ; i--){
                nums[i][j] = count++;
            }
        loop++;
        start++;            
        }
        if(n % 2 == 1){
            nums[start][start] = n*n;
        }
        return nums;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘成长日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值