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

977.有序数组的平方

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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/squares-of-a-sorted-array

双指针

 暴力解法需要遍历数组重新赋值为平方后的数值,然后排序,时间复杂度为O(nlogn),因为数组元素平方的最大值必然在数组的两端,不存在在中间的情况,可以使用双指针解决,降低时间复杂度。

用一个指针指向数组最左边 ,另一个指针指向数组最右边,将两个指针平方后较大的值赋值给新数组,如果左边为较大值,左边的指针+1,如果右边为最大值,右边的指针-1,循环n次给新数组全部赋值后结束循环。

 public int[] sortedSquares(int[] nums) {
          int []res=new int[nums.length];
    	  int count=nums.length-1;
    	  int left=0,right=nums.length-1;
    	  while(left<=right&&count>=0) {
    		  int l=nums[left]*nums[left];
    		  int r=nums[right]*nums[right];
    		  if(l>r) {
    			  res[count--]=l;left++;
    		  }else {
    			  res[count--]=r;right--;
    		  }
    	  }
    	  return res;
    }

209.长度最小的数组

给定一个含有 n 个正整数的数组和一个正整数 target 。

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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-size-subarray-sum

滑动窗口 

left为窗口的起始位置,right为窗口的结束位置,窗口的元素就是题目中的符合条件的数组,当res<target,right++,更新窗口元素的总和;当res>=target,更新题目要求的最小长度,left起始位置+1,right不变,将窗口一直往前移动直到窗口的元素不符合条件,重复以上步骤直到right到达数组的最后一个元素。

 public int minSubArrayLen(int target, int[] nums) {
         int left=0,sum=0,res=Integer.MAX_VALUE;
    	 for(int right=0;right<nums.length;right++) {
    		 sum+=nums[right];
    		 while(sum>=target) {
    			// System.out.println("left:"+left+",right:"+right+",sum:"+sum);
    			 res=res>(right-left+1)?(right-left+1):res;
    			 sum-=nums[left];
    			 left++;
    		 }
    	 }
    	 return res==Integer.MAX_VALUE?0:res;
    }

59.螺旋矩阵

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/spiral-matrix-ii

需要模拟数组顺时针旋转赋值的过程。为了方便处理,使用左闭右开区间,每一行/列的最后一个元素留给下一次循环处理,旋转n/2次,从(0,0)开始旋转,下一次旋转是上一次旋转的对角的下一个元素,所以每次旋转完成startx和starty需要分别+1,每次旋转i和j的最大值都不一样,需要一个变量offset控制,从左到右旋转时,i取starty, j不断+1直到j<n-offset。当n为奇数时,数组中间的元素需要手动赋值n*n。

  public int[][] generateMatrix(int n) {
       int res[][]=new int[n][n];
	   int startx=0,starty=0,offset=1,count=1,loop=0,i,j;
	   while(loop++<n/2) {
		   for(j=starty;j<n-offset;j++) {
			   res[startx][j]=count++;
		   }
		   for(i=startx;i<n-offset;i++) {
			   res[i][j]=count++;
		   }
		   for(;j>=offset;j--) {
			   res[i][j]=count++;
		   }
		   for(;i>=offset;i--) {
			   res[i][j]=count++;
		   }
		   startx++;starty++;offset++;
	   }
	   if(n%2!=0) res[n/2][n/2]=n*n;
	   for(int[] nums:res) {
     	    System.out.println(Arrays.toString(nums));
        }
	   return res;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值