算法记录 | 数组part02
LeetCode 977-有序数组的平方
题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
题解
class Solution {
public:
vector<int> sortedSquares(vector<int> &nums) {
vector<int> res(nums.size(), 0);
int index = nums.size() - 1;
for (int left = 0, right = nums.size() - 1; left <= right;) {
if (nums[left] * nums[left] < nums[right] * nums[right]) {
res[index--] = nums[right] * nums[right];
right--;
} else {
res[index--] = nums[left] * nums[left];
left++;
}
}
return res;
}
};
解题思路
第一次做的时候采用中心扩散法,即找到左右两边正负的分界,然后比较大小,再插入到结果集当中,但是这么操作就需要解决很多不同情况的cases。比如全是正数、全是负数。后面看了卡哥的题解,从最大的数开始遍历,然后依次插入到结果集的最后一个index中,同时更新指针。
LeetCode 209-长度最小的子数组
题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target的长度最小的连续子数组[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入: target = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的子数组。
题解
class Solution {
public:
int minSubArrayLen(int target, vector<int> &nums) {
queue<int> win;
int sum = 0;
int size = nums.size();
int maxLength = size + 1;
for (int i = 0; i < size; i++) {
int cur = nums[i];
win.push(cur);
sum += cur;
// shrink windows
while (sum >= target) {
if (win.size() < maxLength) {
maxLength = win.size();
}
sum -= win.front();
win.pop();
}
}
if (maxLength == size + 1) {
return 0;
}
return maxLength;
}
};
解题思路
题目需要连续子数组,使用滑动窗口解决。刚开始做的时候没有注意题目是大于等于的条件。该题的重点是考虑什么时候添加元素,什么时候收缩窗口。maxLength初始值是一个不存在的值,如果该值最后没有变化,说明没有找到符合条件的窗口。
LeetCode 59-螺旋矩阵II
题目描述:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
题解
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int top = 0, button = n - 1, left = 0, right = n - 1;
int cnt = 1;
vector<vector<int>> matrix(n, vector<int>(n, 0));
while (top < button && left < right) {
for (int i = left; i < right; i++) {
matrix[top][i] = cnt;
cnt++;
}
for (int i = top; i < button; i++) {
matrix[i][right] = cnt;
cnt++;
}
for (int i = right; i > left; i--) {
matrix[button][i] = cnt;
cnt++;
}
for (int i = button; i > top; i--) {
matrix[i][left] = cnt;
cnt++;
}
top++;
button--;
left++;
right--;
}
// last row
if (top == button) {
for (int i = left; left <= right; left++) {
matrix[top][i] = cnt;
cnt++;
}
} else if (left == button) {
for (int i = top; top <= button; i++) {
matrix[i][right] = cnt;
cnt++;
}
}
vector<vector<int>> res;
for (int i = 0; i < n; i++) {
vector<int> temp;
for (int j = 0; j < n; j++) {
temp.push_back(matrix[i][j]);
}
res.push_back(temp);
temp.clear();
}
return res;
}
};
解题思路
这里主要参考了lc54 螺旋矩阵的解法,定义好上下左右四条边界,依次遍历,再将当前的步数计算器的值赋给当前位置。结束之后还需要处理中间那一行的数据填充。