977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思路
使用双指针法
将负数元素平方,与正数元素比较,从后向前填充到新数组中
代码实现
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int>res(nums.size());
int nlen = nums.size()-1;
int left = 0;
int right = nlen;
while(left<=right)
{
if(nums[left]*nums[left]>nums[right]*nums[right])
{
res[nlen--] = nums[left]*nums[left];
left ++;
}
else
{
res[nlen--] = nums[right]*nums[right];
right --;
}
}
return res;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思路
使用滑动窗口
代码实现
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int fast = 0;
int slow = 0;
int sum = 0;
int nlen = nums.size();
int reslen = 0x3f3f3f3f;
while(fast<nlen)
{
sum += nums[fast++];
while(sum>=target)
{
reslen = min(reslen,fast-slow);
sum -= nums[slow++];
}
}
return reslen == 0x3f3f3f3f ? 0 : reslen;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
59.螺旋矩阵
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
思路
这是一道经典题目了,只需要暴力,像转圈一样,把二维数组填满即可
代码实现
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>>matrix(n,vector<int>(n,0));
int index = 1;
int left = 0, right = n-1, top = 0, bottom = n-1;
while(index<=n*n)
{
for(int i= left; i <= right; i ++)
matrix[top][i] = index ++;
top ++;
for(int i = top; i <= bottom; i ++)
matrix[i][right] = index++;
right --;
for(int i = right; i >=left; i --)
matrix[bottom][i] = index ++;
bottom--;
for(int i = bottom; i >= top; i --)
matrix[i][left] = index++;
left ++;
}
return matrix;
}
};
时间复杂度:O(n^2)
空间复杂度:O(1)