D2数组:977.有序数组的平方+ 209.长度最小的子数组+ 59.螺旋矩阵II

文章介绍了如何使用双指针算法解决有序数组的平方问题,以及如何利用滑动窗口法寻找满足和条件的子数组的最小长度。同时讨论了螺旋矩阵的生成方法,遵循循环不变量原则。
摘要由CSDN通过智能技术生成

977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 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]

思路

1、暴力解法
2、双指针

双指针

一左一右,往中间移动,谁大,谁保存到新数组,谁移动

class Solution {
    public int[] sortedSquares(int[] nums) {
int i=0;
int j=nums.length-1;
int k=j;
int[] result=new int[nums.length];
while(i<=j)
{
    if(nums[i]*nums[i]>nums[j]*nums[j])
    {
        result[k--]=nums[i]*nums[i];
        i++;
    }
    else
    {
        result[k--]=nums[j]*nums[j];
        j--;
    }
}
    return result; 
}
}

 

209.长度最小的子数组

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

示例:

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

滑动窗口法:

定义两个指针,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

滑动终止位置,减少时间复杂度

先滑动终止位置,使满足所得和比目标值大于等于,再滑动起始指针,减少子序列长度。

注意:

while循环中是>=,因为题目是>=时符合要求
注意如果所有值加起来都没有满足目标值的话,就应该输出0,这个判断很容易忘记。
定义初始值特别大,如果result没有更新,说明所有值的和加起来没有大于等于目标值,那么子序列长度就是0。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
int i=0;
int j=0;
int sum=0;
int result=Integer.MAX_VALUE;
int length=0;
for(j=0;j<=nums.length-1;j++)
{
sum+=nums[j];
while(sum>=target)
{
length=j-i+1;
result=Math.min(result,length);

sum-=nums[i];
i++;
}
}

return result==Integer.MAX_VALUE?0:result;
    }
}

59.螺旋矩阵II

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

示例:

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

螺旋矩阵:

循环不变量原则:

保证每一条边都不变的处理规则
模拟顺时针画矩阵的过程:

上行从左到右
右列从上到下
下行从右到左
左列从下到上
由外向内一圈一圈这么画下去。

class Solution {
    public int[][] generateMatrix(int n) {
int loop=0;#控制循环次数
int[][] res=new int[n][n];
int start=0;#每次循环开始的点
int count=1;#填充进去的数字
int i,j;

while(loop++<n/2){#判断边界,loop从1开始,n/2就是有几圈
for(j=start;j<n-loop;j++){
    res[start][j]=count++;
}
for(i=start;i<n-loop;i++)
{
    res[i][j]=count++;
}
for(;j>loop-1;j--)
{
    res[i][j]=count++;
}
for(;i>loop-1;i--)
{
    res[i][j]=count++;
}
start++;#改变循环开始的初始点
    }
if (n % 2 == 1)#如果取模余1,说明中间有个心儿,需要把它单独赋值
    {
        res[start][start]=count++;
    }
return res;
}
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值