977. 有序数组的平方
题目链接:LeetCode977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思路:包含负数的有序数组,其数组元素平方最大值分布在数组两端,通过 fabs()
比较原数组两端绝对值大小,将绝对值较大值平方存入新数组末尾。
code:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int head = 0;
int tail = nums.size() - 1;
int index = tail;
vector<int> result(nums.size());
while(head <= tail){
if(fabs(nums[head]) < fabs(nums[tail])){
result[index] = nums[tail] * nums[tail];
tail--;
}else{
result[index] = nums[head] * nums[head];
head++;
}
index--;
}
return result;
}
};
209. 长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
思路:第二遍明确了滑动窗口思想,注意子数组起始位置更新。
code:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int fast = 0;
int slow = 0;
int sum = 0;
int subLength = 0;
int result = INT32_MAX;
while(fast < nums.size()){
sum += nums[fast];
while(sum >= target){
subLength = fast - slow + 1;
result = result < subLength ? result : subLength;
sum -= nums[slow++];
}
fast++;
}
return result == INT32_MAX ? 0 : result;
}
};
59. 螺旋矩阵II
题目链接:LeetCode59. 螺旋矩阵II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
思路:确定矩阵填充圈数,每圈填充元素个数(实现时根据循环不变量原则判断边界),参考文章在文章末尾。
code:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int startx = 0, starty = 0;
int loop = n / 2;
int mid = n / 2;
int count = 1;
int offset = 1;
int i,j;
while (loop --) {
i = startx;
j = starty;
// 上行从左到右(左闭右开)
for (j = starty; j < n - offset; j++) {
result[startx][j] = count++;
}
// 右列从上到下(左闭右开)
for (i = startx; i < n - offset; i++) {
result[i][j] = count++;
}
// 下行从右到左(左闭右开)
for (; j > starty; j--) {
result[i][j] = count++;
}
// 左列从下到上(左闭右开)
for (; i > startx; i--) {
result[i][j] = count++;
}
startx++;
starty++;
// offset每圈加一,遍历长度每圈减一
offset += 1;
}
// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
if (n % 2) {
result[mid][mid] = count;
}
return result;
}
};
循环不变量真是一看就懂,一写就迷。被这道题这么好久,再练在写!