977.有序数组的平方
学习资源
思路
因为有序数组平方的大小是从数组的两边向中间递减的,所以使用前后的双指针比较大小后写入新容器,有点像归并排序的一个单元步骤
代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
vector<int> ans(nums.size());
for(int i = right; i >= 0; i--)
{
if(abs(nums[right]) > abs(nums[left])){
ans[i] = pow(nums[right], 2);
right--;
}
else{
ans[i] = pow(nums[left], 2);
left++;
}
}
return ans;
}
};
思路
因为要求的结果是数组中的连续值,采用滑动窗口法,又因为元素全为正数,少了一个数必然导致总和减小,增加了一个数必然导致总和增加,于是当总和大于等于目标值时左移动移动,当总和小与目标值时,右指针移动
代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
if(nums.empty()) return 0;
int minSize = 99999999;
int left = 0;
int right = 0;
int sum = nums[0];
while(right < nums.size() && left < nums.size()){
if(left > right){
right = left;
}
if(sum < target){
right++;
if(right == nums.size()) break;
sum += nums[right];
continue;
}
else{
minSize = min(minSize, right - left + 1);
sum -= nums[left];
left++;
continue;
}
}
return minSize == 99999999 ? 0 : minSize ;
}
};
思路
每一行或列的循环赋值采取左闭右开原则,上下左右四个边界逐渐逼近内圈,最后单独处理边长为奇数的矩阵的中心点赋值
代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n, 0));
int maxNum = pow(n, 2);
int left = 0;
int right = n - 1;
int top = 0;
int bottom = n - 1;
for(int num = 1; num <= maxNum;){
for(int i = left; i < right && num <= maxNum; i++){
ans[top][i] = num++;
}
for(int i = top; i < bottom && num <= maxNum; i++){
ans[i][right] = num++;
}
for(int i = right; i > left && num <= maxNum; i--){
ans[bottom][i] = num++;
}
for(int i = bottom; i > top && num <= maxNum; i--){
ans[i][left] = num++;
}
left++;
right--;
top++;
bottom--;
if(left >= right && n % 2 == 1){
ans[n/2][n/2] = maxNum;
num++;
}
}
return ans;
}
};