977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
- 错误的vector遍历方式,这会导致访问越界!!!
while(nums[flag]<0)flag++;
倒也不难,我的思路是先找到分界点然后向两头前进,用归并排序的思想解题。
下面是我的答案:
点击查看代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int flag = 0;
while ((nums[flag] < 0) && (flag + 1 < nums.size()))
flag++;
if (flag >= nums.size())
flag = nums.size() - 1;
for (int i = 0; i < nums.size(); i++) {
nums[i] = nums[i] * nums[i];
}
int j, k;
j = 1, k = 1;
vector<int> temp;
if (flag != 0)
if (nums[flag] > nums[flag - 1])
flag--;
temp.insert(temp.end(), nums[flag]);
while ((flag - j >= 0) && (flag + k < nums.size())) {
if (nums[flag - j] < nums[flag + k]) {
temp.insert(temp.end(), nums[flag - j]);
j++;
} else {
temp.insert(temp.end(), nums[flag + k]);
k++;
}
}
if (flag - j < 0)
for (int i = flag + k; i < nums.size(); i++) {
temp.insert(temp.end(), nums[i]);
}
else
for (int i = flag - j; i >= 0; i--) {
temp.insert(temp.end(), nums[i]);
}
return temp;
}
};
我的答案pro版:
点击查看代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
int negative = -1;
for (int i = 0; i < n; ++i) {
if (nums[i] < 0) {
negative = i;
} else {
break;
}
}
vector<int> ans;
int i = negative, j = negative + 1;
while (i >= 0 || j < n) {
if (i < 0) {
ans.push_back(nums[j] * nums[j]);
++j;
}
else if (j == n) {
ans.push_back(nums[i] * nums[i]);
--i;
}
else if (nums[i] * nums[i] < nums[j] * nums[j]) {
ans.push_back(nums[i] * nums[i]);
--i;
}
else {
ans.push_back(nums[j] * nums[j]);
++j;
}
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/447736/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
点击查看代码
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n);
for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
ans[pos] = nums[i] * nums[i];
++i;
}
else {
ans[pos] = nums[j] * nums[j];
--j;
}
--pos;
}
return ans;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solutions/447736/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
记录一下思路:首先窗口不断滑动,先动尾部,当超出target时移动首部直到不超出target,继续移动尾部。同时记录结果最小值。
点击查看代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int count=0;
int start=0;
int num=-1;
for(int i=0;i<nums.size();i++){
count+=nums[i];
if(count>=target){
do{
if((num>i-start)||(num<0))num=i-start+1;
count-=nums[start];
start++;
}while(count>=target);
}
}
if(num>0)return num;
return 0;
}
};
59. 螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
本题投降
可用模拟的思想,模拟矩阵的生成,跑一段直线到头削掉一层,这样的思路最清晰简洁了。
点击查看代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int k=1;
int top=0;
int buttom=n-1;
int left=0;
int right=n-1;
vector<vector<int>>Max(n,vector<int>(n));
while(k<=n*n){
for(int i=left;i<=right;i++,k++) Max[top][i]=k;
top++;
for(int i=top;i<=buttom;i++,k++) Max[i][right]=k;
right--;
for(int i=right;i>=left;i--,k++)Max[buttom][i]=k;
buttom--;
for(int i=buttom;i>=top;i--,k++)Max[i][left]=k;
left++;
}
return Max;
}
};