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]
思路:本题关键在于理解双指针思想。
本题如果只用一个while循环写的话,要写的条件和语句比较冗杂,不如新建一个数组存放新数据,代码既简单由方便理解。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] num = new int[nums.length];
int last = nums.length-1;
int start = 0;
int last1 = nums.length-1;
while(last1>=0){
if( nums[last]* nums[last]>=nums[start]*nums[start]){
num[last1] = nums[last]* nums[last];
last1--;
last--;}
else {
num[last1] = nums[start]*nums[start];
last1--;
start++;
}
}
return num;
}
}
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
提示:
- 1 <= target <= 10^9
- 1 <= nums.length <= 10^5
- 1 <= nums[i] <= 10^5
思路:滑动窗口,不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
思路类似双指针但是有个地方需要注意,相加值大于目标值时不能用if,要用while循环找出最小大于目标值的长度,举个例子,target=20,nums = {1,1,1,1,1,1000,11,1},不难看出使用if进行判断不能满足要求。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int start = 0,sum = 0 , result = Integer.MAX_VALUE,len = 0;
for(int last = 0 ; last < nums.length; last++){
sum += nums[last];
while(sum >= target) {
len = last - start + 1;
result = Math.min(result,len);
sum -= nums[start++];
}
}
return result == Integer.MAX_VALUE ? 0 : result ;
}
}
相关题目推荐
59.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:本题不难主要是注意for循环时的判定条件要相同,也就是 “循环不变量”,具体表现为每次循环时留出的距离。其次循环方向搞清楚,n是否为奇数,做起来就不会有太大的问题。
class Solution {
public int[][] generateMatrix(int n) {
int startx = 0,starty =0;
int[][] res = new int[n][n];
int loop = n/2;
int mid = n/2;
int count = 1;
int offset = 1;
int i,j;
while (loop-->0){
i = startx;
j = starty;
for( ; j <n-offset ;j++){
res[i][j] = count++;
}
for( ; i <n-offset ;i++){
res[i][j] = count++;
}
for( ;j>= offset;j--){
res[i][j] = count++;
}
for( ;i>= offset;i--){
res[i][j] = count++;
}
startx++;
starty++;
offset++;
}
if (n%2 == 1){
res[startx][starty]=count;
}
return res;
}
}
类似题目
- 54.螺旋矩阵
- 剑指Offer 29.顺时针打印矩阵