day02 977

leetcode.977有序数组的平方

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

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

因为是对平方之后的数进行排序,负数的平方可能更大,而平方之后最大的负数在最左边,平方之后最大的正数在最右边,存入新数组应该从这两的最大值开始存,此时用双指针法,最左最右各一个指针对数组进行遍历:新建一个新数组result(长度和原数组大小相等),左指针与右指针进行遍历,平方更大的数放入新数组result中。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int fast=0,slow=nums.length-1;
        int k=nums.length-1;
        int[] result=new int[nums.length];
        while(fast<=slow){  //注意是 ’<=‘而不是’<‘  否则会漏掉一个元素
            if(nums[fast]*nums[fast]<nums[slow]*nums[slow]){
                result[k--]=nums[slow]*nums[slow]; //右边更大,右边平方存入result,右指针向左移动一位
				//新数组 result因为每次存的是最大数,所以从尾部开始更新
                slow--;
            }else{
                result[k--]=nums[fast]*nums[fast];
                fast++;
            }
        }
        return result;
    }
}

209. 长度最小的子数组

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

示例:

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

暴力解法

class Solution {      //暴力解法
    public int minSubArrayLen(int target, int[] nums) {        
        int result=Integer.MAX_VALUE;
        for(int i=0;i<nums.length;i++){   //两个for循环  外层for循环确定左边界  内for循环 从外循i起点开始遍历   确定右边界
            int sum=0;
            for(int j=i;j<nums.length;j++){
                sum+=nums[j];
                if(sum>=target){
                    result=Math.min(result,j-i+1);
                    break;
                }
            }
        }
        return result==Integer.MAX_VALUE?0:result;
    }
}

利用两个指针left,right使用滑动窗口方法

class Solution {     
    public int minSubArrayLen(int target, int[] nums) {
        int left=0,right=0;
        int result=Integer.MAX_VALUE;    //定义一个result变量存储当前数组长度
        int sum=0;      
        for(right=0;right<nums.length;right++){   //快指针先向后遍历,当sum和大于等于target时停止,然后开始操作慢指针向后遍历,只要满足sum>=target,寻找出最小的子序列。
            
            sum+=nums[right];
            while(sum>=target){
                result=Math.min(result,right-left+1);
                sum-=nums[left];
                left++;
            }
        }
        return result==Integer.MAX_VALUE?0:result;  //有不满足条件的情况   则输出0
    }
}

  1. 螺旋矩阵 II
class Solution {
    public int[][] generateMatrix(int n) {
        int l=0;   //左边界
        int r=n-1;  //右边界
        int t=0;   //上边界
        int b=n-1;  //下边界

        int k=1;
        int[][] result=new int[n][n];
        while(k<=n*n){
            for(int i=l;i<=r;i++,k++){  //元素从左边界开始  横坐标改变  纵坐标不变  所以是i=l  i++
                result[t][i]=k;
            }
            t++;   //上边界  填满了一层  所以加一
            for(int i=t;i<=b;i++,k++){   //上边界开始    下边界结束
                result[i][r]=k;      
            }
            r--;
            for(int i=r;i>=l;i--,k++){
                result[b][i]=k;
            }
            b--;
            for(int i=b;i>=t;i--,k++){
                result[i][l]=k;
            }
            l++;
        }
        return result;
    }
}

posted on   你是千堆雪我是长街7  阅读(4)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示