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、暴力解法
2、双指针
双指针
一左一右,往中间移动,谁大,谁保存到新数组,谁移动
class Solution {
public int[] sortedSquares(int[] nums) {
int i=0;
int j=nums.length-1;
int k=j;
int[] result=new int[nums.length];
while(i<=j)
{
if(nums[i]*nums[i]>nums[j]*nums[j])
{
result[k--]=nums[i]*nums[i];
i++;
}
else
{
result[k--]=nums[j]*nums[j];
j--;
}
}
return result;
}
}
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
滑动窗口法:
定义两个指针,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
滑动终止位置,减少时间复杂度
先滑动终止位置,使满足所得和比目标值大于等于,再滑动起始指针,减少子序列长度。
注意:
while循环中是>=,因为题目是>=时符合要求
注意如果所有值加起来都没有满足目标值的话,就应该输出0,这个判断很容易忘记。
定义初始值特别大,如果result没有更新,说明所有值的和加起来没有大于等于目标值,那么子序列长度就是0。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i=0;
int j=0;
int sum=0;
int result=Integer.MAX_VALUE;
int length=0;
for(j=0;j<=nums.length-1;j++)
{
sum+=nums[j];
while(sum>=target)
{
length=j-i+1;
result=Math.min(result,length);
sum-=nums[i];
i++;
}
}
return result==Integer.MAX_VALUE?0:result;
}
}
59.螺旋矩阵II
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
螺旋矩阵:
循环不变量原则:
保证每一条边都不变的处理规则
模拟顺时针画矩阵的过程:
上行从左到右
右列从上到下
下行从右到左
左列从下到上
由外向内一圈一圈这么画下去。
class Solution {
public int[][] generateMatrix(int n) {
int loop=0;#控制循环次数
int[][] res=new int[n][n];
int start=0;#每次循环开始的点
int count=1;#填充进去的数字
int i,j;
while(loop++<n/2){#判断边界,loop从1开始,n/2就是有几圈
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-1;j--)
{
res[i][j]=count++;
}
for(;i>loop-1;i--)
{
res[i][j]=count++;
}
start++;#改变循环开始的初始点
}
if (n % 2 == 1)#如果取模余1,说明中间有个心儿,需要把它单独赋值
{
res[start][start]=count++;
}
return res;
}
}