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]
问题分析:
①先平方后,再快速排序 。时间复杂度为:O(nlogn),取决于快速排序的时间复杂度。
②定义一个新数组,定义两个指针,分别在前后。 一个向前遍历,一个向后遍历。 判断两边平方之后的大小(有可能有负数在前,所以先从头尾比较大小)。 如果前面大,就把平方后的值赋给新数组,因为此题为递增顺序,而找出的是最大值,所以把平方后的值放到尾部,再递减新数组下标值k。
方法一:双指针法
class Solution {
public int[] sortedSquares(int[] nums) {
int[] result =new int[nums.length];
int left=0;
int right= nums.length-1;
int k= nums.length-1;
for(left=0,right= nums.length-1;left<=right;){
if(nums[left]*nums[left]>nums[right]*nums[right]){
result[k]=nums[left]*nums[left];
k--;
left++;
}
else{
result[k]=nums[right]*nums[right];
k--;
right--;
}
}
return result;
}
}
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
问题分析 :
①两个for循环,一个是作为子数组的起点(起点为i=0), 另一个为子数组的终点(起点为j=i)。 ②双指针法,left为起始,一直向后遍历,当sum的值大于等于s, 则记录此时数组的长度,和result最终结果值比较,如果小则赋值为数组长度。 sum要减去right移动前的数组值,之后right作为起始位置才可以++。
方法一:滑动窗口
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0;
int left=0;//起始
int sublen;//子数组长度
int result=Integer.MAX_VALUE;//设为最大值
for(int right=0;right<nums.length;right++){
sum+=nums[right];
while (sum>=target){
sublen=right-left+1;
result = result < sublen ? result : sublen;
sum=sum-nums[left];//!!!left要向后移,所以减去之前的值,不然就多加了!
left++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
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]]
问题分析:
左闭右开。每条边只处理第一个点,不处理最后一个点。
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums=new int[n][n];
int i,j;
int starx=0;//起始位置
int stary=0;
int count=1;//数值
int offset=1;//控制每一行的长度,左闭右开,右边-1位
int loop=0;//圈数
while(loop++<n/2){
for(j=stary;j<n-offset;j++){
nums[starx][j]=count++;
}
for (i=starx;i<n-offset;i++){
nums[i][j]=count++;
}
for (;j>stary;j--){
nums[i][j]=count++;
}
for(;i>starx;i--){
nums[i][j]=count++;
}
stary++;
starx++;
offset++;
}
if(n%2==1){
nums[starx][stary]=count;
}
return nums;
}
}