977 有序数组的平方
题目描述
给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
思路
- 先将数组内数字平方,再使用快速排序进行排序。
- 新建一个vector数组result,用两个指针分别指向数组nums首尾,比较首尾指针指向数字的平方大小,将较大的数字平方加入到result尾部,最终返回result。
代码实现(双指针)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int length = nums.size();
vector<int> result(length,0);
int k = length - 1;
for(int i = 0, j = length - 1; i <= j;){
if(nums[i] * nums[i] > nums[j] * nums[j]){
result[k--] = nums[i] * nums[i];
i++;
}
else{
result[k--] = nums[j] * nums[j];
j--;
}
}
return result;
}
};
209 长度最小的子数组
题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的连续子数组并返回其长度。如果不存在符合条件的子数组,返回0。
思路
滚动窗口思想,设置两个指针,分别指向窗口的首尾,尾部指针从头到尾进行遍历,当头尾指针中间数字和大于等于target时,记录头尾之间的长度,头指针后移,选取头尾之间长度最小值,返回头尾指针中间数字组成的新数组长度。
代码实现(滚动窗口)
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res = nums.size()+1;//新数组长度初始化为一个大值
int sum = 0, i = 0, length = 0;
for(int j = 0; j < nums.size(); j++){
sum += nums[j];
while(sum >= target){
//当出现符合条件的子数组时,记录长度
length = j - i + 1;
res = min(length,res);
sum -= nums[i];//移除首数字,进行下一次循环的比较,找出最小长度
i++;
}
}
//如果res的值没有发生改变,说明不存在符合条件的子数组,返回0
if(res == nums.size() + 1)
return 0;
return res;
}
};
时间复杂度O(n);空间复杂度O(1)。
59 螺旋矩阵Ⅱ
题目描述
给你一个正整数n ,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix。
思路
明确数组螺旋时的边界处理即可。
代码实现
class Solution{
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> nums(n, vector<int>(n,0));//定义一个二维数组
int startx = 0, starty = 0;
int count = 1;
int i, j;
int loop = n / 2;
int mid = n / 2;//中心元素位置坐标
int m = n;
while(loop){
//上左下右四条边依次遍历赋值
for(j = starty; j < m - 1; j++)
nums[startx][j] = count++;
for(i = startx; i < m - 1; i++)
nums[i][j] = count++;
for(; j > starty; j--)
nums[i][j] = count++;
for(; i > startx; i--)
nums[i][j] = count++;
startx++;
starty++;
loop--;
m--;
}
if(n % 2)
nums[mid][mid] = count;//如果n是奇数,中心元素的值为count
return nums;
}
};
今天补上了昨天的。。