977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
- 要点
- 因为平方和最大值总在左右两端,可以用左右双指针方法;
- 新分配一个数组,比较左右指针的对应值,将大的加入其中。
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
- 滑动窗口方法、暴力解法
- 理解滑动窗口的动图过程
在本题中实现滑动窗口,主要确定如下三点:
- 窗口内是什么?
- 如何移动窗口的起始位置?
- 如何移动窗口的结束位置?
- 窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于target了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
解题的关键在于 窗口的起始位置如何移动。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result=INT32_MAX; //记录返回的子数组的长度
int sum=0; //子数组的和
int i=0; //滑动窗口起始点的位置
int sublength=0; //记录子数组的长度
for(j=0; j<nums.size(); j++){
sum+=nums[j];
while(sum >= target){
sublength = j-i+1;
result = result <= sublength ? result: sublength; //更新子数组长度
//试缩小窗口
sum -= nums[i];
}
}
return result==INT32_MAX? 0: result;
}
};
- 时间复杂度为O(n)
59.螺旋矩阵II
给你一个正整数 n n n ,生成一个包含 1 到 n 2 n^2 n2 所有元素,且元素按顺时针顺序螺旋排列的 n ∗ n n*n n∗n 正方形矩阵 matrix 。
要点
- 边界判断
- 行和列的起始位置更新
- 中间那个位置的值处理