您现在的位置是:首页 >技术杂谈 >代码随想录第二天 |977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II网站首页技术杂谈

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

程序员辉code 2024-06-17 06:01:02
简介代码随想录第二天 |977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

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

997有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

解题思路

  • 使用头尾双指针的方式

代码演示

 public int[] sortedSquares(int[] nums){
	int left = 0,right = nums.length - 1;
	int[] result = new int[nums.length];
    int index = right;
	while(left <= right){
	   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; 
}

时间复杂度:O(n)
空间复杂度:O(n)

209.长度最小的子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

解题思路

滑动窗口的方法

  • 一层for循环使用的是终止位置

使用暴力解法

代码演示

暴力解法

       public int minSubArrayLen2(int target, int[] nums) {
      //暴力解法
      int sum = 0;
      int result = Integer.MAX_VALUE;
      int subLength = 0;
      for(int i = 0; i < nums.length; i++){
          sum = 0;
          for(int j = i; j < nums.length; j++){
              sum += nums[j];
              if(sum >= target){
                 subLength = j -i + 1;
                 result = Math.min(result,subLength);
                 break;
              }
          }
      }
      return result == Integer.MAX_VALUE ? 0 : result;
     }

时间复杂度:O(n2)
空间复杂度:O(1)

滑动窗口

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

时间复杂度:O(n)
空间复杂度:O(1)

59.螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

解题思路

  • 循环不变量,每一行遍历的遵循一个原则。按照右下左上进行遍历

  • 如果是奇数,最后进行判断赋值。

代码演示

public int[][] generateMatrix(int n){
	
	int loop = n/2;
	int mid = n/2;
	int startx = 0;
	int starty = 0;
	int offerSet = 1;
	int i,j;
	int count = 1;
	int[][] result = new int[n][n];
	whilie(loop-- > 0){
		i=startx;
		j=starty;
		
		for(j = starty; j < n - offerSet; j++){
		result[i][j] = count++;
	}
	
		for(i = startx; i < n - offerSet; i++){
		result[i][j] = count++;
	}
	
	for(; j > startx; j--){
		result[i][j] = count++;
	}
		for(; i > starty; i--){
		result[i][j] = count++;
	}
	
	startx++;
	starty++;
	offerSet++;
	}
	if(n % 2 == 1){
		result[mid][mid] = count++;
	}
	return result;
}

时间复杂度:O(n)
空间复杂度:O(n2)

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。