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;
}
}
这一题思想不难,但是各种边界和执行条件真的要好好确认