代码随想录刷题笔记-Day02

1. 有序数组的平方

977.有序数组的平方icon-default.png?t=N7T8https://leetcode.cn/problems/squares-of-a-sorted-array/description/

给你一个按非递减顺序排序的整数数组 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]
解释:平方后,数组变为 [49,9,4,9,121],排序后,数组变为 [4,9,9,49,121]

解题思路

需要进行平方后排序,平方后就是乱序了,平方后是一个V形曲线,先降后升,想要找到最小值很难,但是最大值一定在首尾交替,采取双指针从后往前填写新数组。

边界值考虑:

当左指针大于右指针的时候终止。

代码

class Solution {
	public int[] sortedSquares(int[] nums) {
		int n = nums.length;
		int[] res = new int[n];
		int left = 0, right = n - 1;
		int index = n - 1;
		while (left <= right) {
			int leftNum = nums[left] * nums[left];
			int rightNum = nums[right] * nums[right];
			if (leftNum > rightNum) {
				res[index--] = leftNum;
				left++;
			} else {
				res[index--] = rightNum;
				right--;
			}
		}

		return res;
	}
}

2. 长度最小的子数组

209. 长度最小的子数组icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-size-subarray-sum/description/给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 长度最小的连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例 1:

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

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5 

 解题思路

题目要求找到一个最小的子数组,第一反应是需要维持一个滑动窗口,动右边界直到累加和大于或等于target,然后动左边界直到

边界值分析:

当右边界为n-1,且左边界移动到累加和小于target的时候终止。

代码

class Solution {
	public int minSubArrayLen(int target, int[] nums) {
		int left = 0, right = 0;
		int n = nums.length;
		int length = n + 1;
		int sum = 0;
		while (right < n || sum > target) {
			if (sum < target) {
				sum += nums[right++];
			} else {
				sum -= nums[left++];
			}
			if (sum >= target) {
				length = Math.min(length, right - left);
			}
		}

		return length == n + 1 ? 0 : length;
	}
}

3. 螺旋矩阵II

59. 螺旋矩阵 IIicon-default.png?t=N7T8https://leetcode.cn/problems/spiral-matrix-ii/description/

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

示例 1:

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

解题思路

这道题不涉及什么算法,主要就是模拟过程。

边界值分析:

会有n/2圈,也就是n/2个循环,第i次循环分为四次单方向移动,。如果n为奇数,那么会剩下一个中心点,需要额外进行赋值。

代码

class Solution {
	public int[][] generateMatrix(int n) {
		int[][] res = new int[n][n];
		int num = 1;
		for (int i = 1; i <= n / 2; i++) {
			for (int j = i - 1; j < n - i; j++) {
				res[i - 1][j] = num++;
			}
			for (int j = i - 1; j < n - i; j++) {
				res[j][n - i] = num++;
			}
			for (int j = n - i; j > i - 1; j--) {
				res[n - i][j] = num++;
			}
			for (int j = n - i; j > i - 1; j--) {
				res[j][i - 1] = num++;
			}
		}

		if (n % 2 == 1) {
			res[n / 2][n / 2] = n * n;
		}

		return res;
	}
}

你可能感兴趣的:(代码随想录,算法,笔记,java)