目录
- 复习用tip
- 997. 有序数组的平方
- **思路1(双指针)**
- **思路2:利用容器sort方法排序**
- 209. 长度最小的子数组
- 59. 螺旋矩阵 II
复习用tip
1、总是忘记的,vector初始化设置大小用"()",不是用"[]"!
这里不需要对size的强制类型转换,
vector<int>vec(2);//size为2的vector变量
vector<int>vec[2];//两个size为0的vector数组
2、用于记录类型最大/最小值的宏常量,存在于<limits.h>中
#define MB_LEN_MAX 5//获取多字节字符中的最大字节数
#define SHRT_MIN (-32768)//short
#define SHRT_MAX 32767
#define USHRT_MAX 0xffff//unsigned short
#define INT_MIN (-2147483647 - 1)//int
#define INT_MAX 2147483647
#define UINT_MAX 0xffffffff//unsigned int
#define LONG_MIN (-2147483647L - 1)//long
#define LONG_MAX 2147483647L
#define ULONG_MAX 0xffffffffUL//unsigned long
#define LLONG_MAX 9223372036854775807i64//long long
#define LLONG_MIN (-9223372036854775807i64 - 1)
#define ULLONG_MAX 0xffffffffffffffffui64//unsigned long long
997. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 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 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序
思路1(双指针)
利用双指针,从两侧向中间(绝对值由大到小) 进行摆放
vector<int> sortedSquares(vector<int>& nums) {
vector<int>ans(nums.size());
int high=nums.size()-1,low=0;
for(int i=high;i>=0;i--){
int h=nums[high]*nums[high],l=nums[low]*nums[low];
if(h>l){
ans[i]=h;
high--;
}else{
ans[i]=l;
low++;
}
}
return ans;
}
思路2:利用容器sort方法排序
简单粗暴的先平方、在排序。但是思考空间较小,练习时尽量不用。
vector<int> sortedSquares(vector<int>& nums) {
vector<int> ans;
for (int num: nums) {
ans.push_back(num * num);
}
sort(ans.begin(), ans.end());
return ans;
}
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
int minSubArrayLen(int target, vector<int>& nums) {
size_t n = nums.size();
int left = 0, right = 0;//滑动窗口的左右两边
int sum{ 0 };//当前滑动窗口内数的总和,随着窗口变动而变动
int len{ INT_MAX };//当前符合条件的滑动窗口,默认最大长度,找最小的
for (right = 0; right < n; right++) {//窗口右侧一直动,当等于/超过target时,左侧才动
sum += nums[right];
/*if (sum < target) {//若小于,滑动窗口不够长,右边继续延伸
continue;
}*/
while (sum >= target) {//若大于等于,寻找最小的窗口
len = min(len, right - left + 1);
sum -= nums[left];
left++;
}
}
return len == INT_MAX ? 0 : len;
}
59. 螺旋矩阵 II
题目链接
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路:确认好每次循环的起始点和终点,按顺序填充即可。
难点在于把握统一的区间,这里采用左闭右开
借用卡哥这张图,一目了然
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n, 0)); // 二维数组定义
int start_x{ 0 }, start_y{ 0 };//每次循环的开始
int loop{ n / 2 };//4个边遍历的循环次数
int offset{ 1 };//每次遍历的【终点值】:n-1,n-2,n-3,...,控制边长度用
//每次循环边遍历的长度:n-1,n-3,n-5...
int num{ 1 };
while (loop--) {
//左闭右开: [l,r)
int j{ start_y }, i{ start_x };
//→
for (; j < n - offset; j++) {
ans[i][j] = num;
num++;
}
//↓
for (; i < n - offset; i++) {
ans[i][j] = num;
num++;
}
//←
for (; j > start_y; j--) {
ans[i][j] = num;
num++;
}
//↑
for (; i > start_x; i--) {
ans[i][j] = num;
num++;
}
offset++;
start_x++;
start_y++;
}
if (n % 2) ans[n / 2][n / 2] = num;
return ans;
}