代码随想录Day2|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

//    给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
非递减顺序的数组平方后两边的数值是最大的,可以用这个特点用两个指针一前一后不断比较大小,较大的从result尾部倒着输入。
    public int[] sortedSquares(int[] nums) {
        int[] result=new int[nums.length];
        int index=nums.length-1;
        for(int left=0,right=nums.length-1;left<=right;index--){
            if (nums[left]*nums[left]>nums[right]*nums[right]){
             result[index]=nums[left]*nums[left];
             left++;
            }
            else {
                result[index]=nums[right]*nums[right];
                right--;
            }
        }
        return result;
        }     
//    给定一个含有 n 个正整数的数组和一个正整数 target 。
//    找出该数组中满足其总和大于等于 target 的长度最小的子数组
// [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 
首先肯定需要遍历整个数组从头到尾相加找到和大于target的子数组,通过前后两个指针可以将子数组进行不断地伸缩。

在一个for循环中j指针不断后移使得子数组相加大于target,满足后记录目前最短的子数组长length,就可以挪动前指针i,缩短子数组长看是否满足相加大于target,最后不断循环返回最短子数组长result。
    public int minSubArrayLen(int target, int[] nums) {
        int left=0,right=0,result=Integer.MAX_VALUE,sum=0,length=0;
        for(right=0;right<nums.length;right++){
            sum+=nums[right];
            while(sum>=target){
                length=right-left+1;
                result=result<length?result:length;
                sum-=nums[left++];
            }
        }
        return result==Integer.MAX_VALUE?0:result;
    }
//给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

可以观察出按照顺时针螺旋顺序的规律,先向右遍历后向下再左最后上,循环终止条件即为left和right相等并且top和bottom相等。
二维数组的一个框为数轴的y轴,第二框为数轴的x轴。
public int[][] generateMatrix(int n) {
    int[][] result=new int[n][n];
    int value=1,left=0,right=n-1,top=n-1,bottom=0;
    while(left<=right&&bottom<=top) {
        for (int x = left, y = bottom; x <=right; x++) {
            result[y][x] = value++;
        }
        bottom++;
        for (int x=right,y=bottom;y<=top;y++){
            result[y][x]=value++;
        }
        right--;
        for (int x=right,y=top;x>=left;x--){
            result[y][x] = value++;
        }
        top--;
        for (int x=left,y=top;y>=bottom;y--){
            result[y][x] = value++;
        }
        left++;
    }
    return result;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值