代码随想录算法训练营第二天| 977.有序数组的平方 、 209.长度最小的子数组、 59.螺旋矩阵II
题目描述:给你一个按 非递减顺序 排序的整数数组
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 class Solution { 2 public int[] sortedSquares(int[] nums) { 3 int k = nums.length - 1; 4 int[] res = new int[nums.length]; 5 6 for (int i = 0, j = nums.length - 1; i <= j;) { 7 if (nums[i] * nums[i] < nums[j] * nums[j]) { 8 res[k--] = nums[j] * nums[j]; 9 j--; 10 } else { 11 res[k--] = nums[i] * nums[i]; 12 i++; 13 } 14 } 15 return res; 16 } 17 }
题目描述:
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 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
思路
class Solution { public int minSubArrayLen(int target, int[] nums) { int res = Integer.MAX_VALUE; int sum = 0; //滑动窗口之和 int i = 0; //起始位置 int subLen = 0; for (int j = 0; j < nums.length; j++) { sum += nums[j]; while (sum >= target) { subLen = j - i + 1; res = res < subLen ? res : subLen; sum -= nums[i++]; } } return res == Integer.MAX_VALUE ? 0 : res; } }
题目描述:
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
我们顺时针定义四个方向:上右下左。
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
算法讲解
从左上角开始遍历,先往右走,走到不能走为止,然后更改到下个方向,再走到不能走为止,依次类推,遍历 n2
�
2
个格子后停止。
class Solution { public int[][] generateMatrix(int n) { int[][] matrix = new int[n][n]; int count = n * n; int[] dx = {0,1,0,-1}; int[] dy = {1,0,-1,0}; for (int i = 1,x = 0, y = 0, d = 0; i <= count; i++) { matrix[x][y] = i; int a = x + dx[d]; int b = y + dy[d]; if ( a < 0 || a >= n || b < 0 || b >= n || matrix[a][b] != 0) { d = (d + 1) % 4; } x += dx[d]; y += dy[d]; } return matrix; } }