977. 有序数组的平方
已解答
简单
相关标签
相关企业
给你一个按 非递减顺序 排序的整数数组
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 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
题解:
class Solution {public int[] sortedSquares(int[] nums) {for(int i = 0; i < nums.length; i++){nums[i] = nums[i] * nums[i];}int[] nums1 = new int[nums.length];int left = 0;int right = nums.length-1;int i = nums1.length-1;while(left <= right){if(nums[left] > nums[right]){nums1[i--] = nums[left++];}else{nums1[i--] = nums[right--];}}return nums1;}
}
本题使用双指针思想,实际上排序过程是不通用的,本来一个正负向的有序数组在平方后顺序发生了变化,但还是有一定规律,所以这里用双指针可以轻松做出来
代码
测试用例
测试用例
测试结果
209. 长度最小的子数组
已解答
中等
相关标签
相关企业
给定一个含有
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提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
进阶:
- 如果你已经实现
O(n)
时间复杂度的解法, 请尝试设计一个O(n log(n))
时间复杂度的解法。
class Solution {public int minSubArrayLen(int target, int[] nums) {if(nums.length == 0){return 0;}else if(nums.length == 1 && nums[0] < target){return 0;}else if(nums[0] > target){return 1;}int slowI = 0;int fastI = 0;int sum = nums[0];int size = 0;//窗口长度while(slowI <= nums.length - 1){if(sum < target && fastI < nums.length - 1){sum += nums[++fastI];}if(sum >= target){if(size != 0){size = Math.min(fastI - slowI + 1,size);}else size = fastI - slowI + 1;sum -= nums[slowI++];}if(fastI == nums.length - 1 && sum < target){return size;}}return size;}
}
这题也是使用双指针,利用一个窗口不断滑动,其中边界问题调试了挺久,思路是快指针先动,留一个sum记录当前数字的和,然后往前加,在这期间慢指针不动,然后当大于sum大于target后,开始不断减慢指针指向的数据缩减窗口大小,最后找出最合适的答案。
代码
测试用例
测试结果
测试结果
59. 螺旋矩阵 II
已解答
中等
相关标签
相关企业
给你一个正整数
n
,生成一个包含1
到n2
所有元素,且元素按顺时针顺序螺旋排列的n x n
正方形矩阵matrix
。示例 1:
输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:
输入:n = 1 输出:[[1]]提示:
1 <= n <= 20
class Solution {public int[][] generateMatrix(int n) {int loop = 0; // 控制循环次数int[][] res = new int[n][n];int start = 0; // 每次循环的开始点(start, start)int count = 1; // 定义填充数字int i, j;while (loop++ < n / 2) { // 判断边界后,loop从1开始// 模拟上侧从左到右for (j = start; j < n - loop; j++) {res[start][j] = count++;}// 模拟右侧从上到下for (i = start; i < n - loop; i++) {res[i][j] = count++;}// 模拟下侧从右到左for (; j >= loop; j--) {res[i][j] = count++;}// 模拟左侧从下到上for (; i >= loop; i--) {res[i][j] = count++;}start++;}if (n % 2 == 1) {res[start][start] = count;}return res;}
}
这一题思想不难,但是各种边界和执行条件真的要好好确认