算法小白训练营日记,笔记为自用,若有错误感谢指出
--今日任务--:977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
977.有序数组的平方
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
暴力方法:每个数都平方后再排序
快排函数:sort(A.begin(), A.end());
暴力方法代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for (int i = 0; i < A.size(); i++) {
A[i] *= A[i];
}
sort(A.begin(), A.end()); // 快速排序
return A;
}
};
双指针法:数组左右两边平方后必定是最大的,左右两边数平方后比较大小放入新数组中,再将数组逆置即可。
vector容器定义数组:vector<int> newNums;
数组中按序定义元素:newNums.push_back(sLeft);
逆置数组中元素:reverse(newNums.begin(),newNums.end());
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int left=0,right=nums.size()-1;
vector<int> newNums;
while(left<=right){
int sLeft=nums[left]*nums[left];
int sRight=nums[right]*nums[right];
if(sLeft>=sRight){
newNums.push_back(sLeft);
left++;
}
else{
newNums.push_back(sRight);
right--;
}
}
reverse(newNums.begin(),newNums.end());
return newNums;
}
};
209.长度最小的子数组
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
具体思路:双指针设置滑动窗口,i为滑动窗口起始位置,j为窗口末尾位置,sum为窗口中元素总和,定义结果res为最大数。移动滑动窗口末尾位置,计算总和,若窗口内数值总和大于target,计算窗口内含有数值个数,比较res大小,更新结果,移动窗口起始位置,再次比较大小。重复上述步骤遍历数组,得到最小窗口大小,若都不满足题意,则res无法更新,依旧为最大数,则结果为0。
代码如下:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0,sum=0,res=INT32_MAX,subLength=0;
for(int j=0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
subLength=j-i+1;
res=res<subLength?res:subLength;
sum-=nums[i++];
}
}
return res==INT32_MAX?0:res;
}
};
59.螺旋矩阵II
题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
思路:重点为边界问题,坚持循环不变量法则,按照左闭右开书写代码,定义starxtx,starty为每一层循环的起始位置,循环一圈后都+1,offset用于控制每条边遍历的长度,cnt为排序元素,loop循环次数,若n为奇数时,循环剩最后一个时单独赋值。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int startx=0,starty=0;
int offset=1;
int cnt=1;
int i,j;
int loop=n/2;
vector<vector<int>> res(n, vector<int>(n, 0));
while(loop--){
i = startx;
j = starty;
for(j;j<n-offset;j++){
res[starty][j]=cnt++;
}
for(i;i<n-offset;i++){
res[i][j]=cnt++;
}
for(j;j>starty;j--){
res[i][j]=cnt++;
}
for(i;i>startx;i--){
res[i][j]=cnt++;
}
startx++;
starty++;
offset++;
}
if(n%2==1){
res[n/2][n/2]=cnt++;
}
return res;
}
};