刷题day2 有序数组的平方、长度最小的子数组、螺旋矩阵

1、有序数组的平方

这道题主要是要理解双指针的思想,主要是确定一个思路:在这个递增序列的数组中,要考虑到平方之后,只有两边的值是最大的,不管是负数边还是正数边,所以可以使用双指针,一个头一个尾,比较两者平方的大小,依次向下比较

这道题还有一个点是java的数组创建,int[]  index = new int[nums.length];这表示创建一个数组index,其长度和nums的数组长度相同

class solution{
    public int[] sortedSquares(int[] nums){
        int left = 0;
        int right = nums.length - 1;
        int[] index = new int[nums.length];
        int a = nums.length - 1;
        while(left <= right)
        {
            if(nums[left]*nums[left] < numms[right]*nums[right])
            {
                index[a--] = nums[right]*nums[right];
                --right;
            }
            else{
                index[a--] = nums[left]*nums[left];
                ++left;
            }
        }
        return index;
}

 2、长度最小的子数组

这道题主要掌握一个滑动窗口的使用,并且这个应用场景适合滑动窗口,滑动窗口创建是通过在for循环内部while循环sum -=nums[i++];这就同时做到了双值变更,所以很精妙,这句代码,具体代码如下:

class solution{
    public int minSubArrayLength(int target,int[] nums){
        int i = 0;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for(int j = 0;j<nums.length;j++)
        {
            sum += nums[j];
            while(sum >= target)
            {
                result = Math.min(result,j-i+1);
                sum -= nums[i++];
            }
        }
        return result == Integer.MAX_VALUE?0:result;
}

3、螺旋矩阵II

这道题的关键思想在于你比如说给了n=5,那么他的循环次数就是while(loop<2),5/2=2,循环次数loop取得是n/2,外层一次循环就是四个过程,左到右,上到下,右到左,下到上,然后每次循环到末尾时,这些i和j都是停留在那里了,是个定值,下一个for又可以使用,相当于位置和值一直给下边for输送,恰恰值也是这样传递下去的

最后还得判断一下n是否是奇数,因为以上每次四次for都是在填每一层的循环,是一个完整的层次,所以在n为奇数的时候就是中间的值得单独设定,否则中间的值是空的,最后打印出来也就是默认值0;

代码如下:

class solution{
    public int[][] generateMatrix(int n)
    {
        int start = 0;                        //每次填充的开始位置res[start][start]
        int loop = 0;                         //循环的次数
        int num = 1;
        int[][] res = new int[n][n];
        int i,j;
        while(loop < n/2)
        {
            for(j=start;j<n-loop;j++)        //for循环的条件得注意一下,前两次是增加所以是小                                                                                    
                                               于n-loop
            {            
                res[start][j] = num++;
            }
            
            for(i = start;i<n-loop;i++)
            {
                res[i][j] = num++;            //j,num的值接上的for,加到多少就还是多少
            }
            
            for(;j>=loop;j--)                 //后两次的for循环条件得注意,是大于等于loop的
            {
                res[i][j] = num++;
            }
            
            for(;i>=loop;i--)
            {
                res[i][j] = num++;
            }
            
            start++;
        }

        if(n%2 == 1)
        {
            res[start][start] = num;
        }
     }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值