有序数组的平方
题目
给你一个按 非递减顺序 排序的整数数组 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]
题解
方法一
暴力解法 直接把所有元素平方后进行排序
class Solution {
public int[] sortedSquares(int[] nums) {
for(int i = 0;i<nums.length;i++){
nums[i]*=nums[i];
}
Arrays.sort(nums);
return nums;
}
}
方法二
双指针法
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,i指向起始位置,j指向终止位置。
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。
每次比较 两指针指向元素的大小 谁大赋值给新元素并且指针移动一位
class Solution {
public int[] sortedSquares(int[] nums) {
int n = nums.length;
int[] result =new int[n];
int k = n -1;
int left = 0;
int right =n-1 ;
while(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;
}
}
长度最小的子数组
题目
给定一个含有 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
解题方法
滑动窗口
何为滑动窗口?
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
首先我们定义两个指针 start end 一开始都指向数组的 起始位置
紧接着end不断向后移动 同时我们计算两个指针之间数据的和 与正整数s比较
当和小于s end移动 start不动
当和大于s star向前移动 end不动
因为start 和 end 在不停变化 所以称为滑动窗口
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int end = 0;//访问数组的指针
int result = nums.length+1;
int sum = 0;
int start = 0;
int length = 0;
for(end=0;end<nums.length;end++){//end不停移动
sum+=nums[end];//计算窗口内元素的和
while(sum>=target){//当sum>target移动start
length =end-start+1 ;//计算新窗口内元素个数
result = result>length?length:result;
sum-=nums[start++];
}
}
return result==nums.length+1?0:result;
}
}
螺旋矩阵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 2 最后一列只处理 3 4
class Solution{
public int[][] generateMatrix(int n){
int[][] nums = new int[n][n]
int startx = 0; int starty = 0;//控制每圈的起始位置
int offset = 1;//控制每圈处理元素的个数
int i,j;//控制行列
int time = n/2;//控制圈数
int count = 1;
while(time-->0){
for(j = stary;j<n-offset;j++){
nums[starx][i] = 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++;
}
starx++;
stary++;
offset++;
}
if(n%2==1){
nums[starx][stary] = count;
}
return nums;
}
}