977.有序数组的平方
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
数组是非递减排序的,虽然存在负数平方后值更大的情况,但是可以确定最大值一定在两端,那么只要从两端向中间靠拢就可以从大到小排序了,可以使用双指针分别指向数组开始和末尾,比较平方较大的值插入新数组的末尾。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int fast = 0;
int slow = nums.size()-1;
vector<int> res(nums.size(),0);
for(int i = nums.size()-1; i >= 0; i--){
if(nums[fast]*nums[fast] >= nums[slow]*nums[slow]){
res[i] = nums[fast]*nums[fast];
fast++;
}else {
res[i] = nums[slow]*nums[slow];
slow--;
}
}
return res;
}
};
209.长度最小的子数组
题目:给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0
通过滑动窗口,不断改变序列的起始位置,得到满足条件的结果。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int result = INT32_MAX;
int sum = 0;
int i = 0;
int j=0;
int subLength = 0;
while(j<nums.size()){
sum +=nums[j];
while(sum>=target){
subLength = (j-i+1);//子串长度
result = result <subLength ? result : subLength;
sum -= nums[i++];//起点向后移动
}
j++;
}
return result == INT32_MAX ? 0 : result;
}
};
59.螺旋矩阵II
题目:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
写的时候注意边界条件的判断,保持同一种边界判定,这样避免出现重复,或者缺失。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int up = 0, down = n - 1, left = 0, right = n - 1;
int num = 1;
while (num<=n*n) {
for (int i = left; i <= right; ++i) res[up][i] = num++;
++up;
for (int i = up; i <= down; ++i) res[i][right] = num++;
--right;
for (int i = right; i >= left; --i) res[down][i] = num++;
--down;
for (int i = down; i >= up; --i) res[i][left] = num++;
++left;
}
return res;
}
}
本文解析了三道LeetCode上的经典算法题:有序数组的平方、长度最小的子数组及螺旋矩阵II。针对每道题都提供了详细的思路分析及C++代码实现。
398

被折叠的 条评论
为什么被折叠?



