1. 977 有序数组平方
a.暴力求解
直接平方后,插入新数组,再排序
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> vecRes; //这里多余申请了一个数组,直接原数组操作就行
int iLen = nums.size();
for(int i = 0; i < iLen; i++)
{
vecRes.push_back(nums[i] * nums[i]);
}
sort(vecRes.begin(), vecRes.end());
return vecRes;
}
};
b. 双指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> vecRes(nums.size(), 0); //要初始化申请空间
int iLeft = 0;
int iRight = nums.size() - 1;
int iSaveIndex = iRight;
while(iLeft <= iRight) // <= 别忘了最后一个元素
{
if(nums[iLeft] * nums[iLeft] < nums[iRight] * nums[iRight])
{
vecRes[iSaveIndex--] = nums[iRight] * nums[iRight];
iRight--;
}
else
{
vecRes[iSaveIndex--] = nums[iLeft] * nums[iLeft];
iLeft++;
}
}
return vecRes;
}
};
2. 209 长度最小的子数组(注:开始无思路,后续可复习)
滑动窗口,也可以看做双指针
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int iLeft = 0;
int iRight = 0;
int iLen = nums.size();
int iMinLength = 0;
int iSum = 0;
int iRes = INT32_MAX;
for(iRight = 0; iRight < iLen; iRight++)
{
iSum += nums[iRight];
while(iSum >= target)
{
iMinLength = iRight - iLeft + 1;
//此处要把历史最小值保存下来
iRes = iRes < iMinLength ? iRes : iMinLength;
//左窗口++是减少运算的关键
iSum -= nums[iLeft++];
}
}
//判断是否找到过满足条件的数组
return iRes == INT32_MAX? 0 : iRes;
}
};
3. 59 螺旋矩阵Ⅱ(注:开始无思路,后续可复习)
本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
坚持循环不变量原则,如果一开始左闭右开,就坚持用下去;
在看着解析的情况下,写出了代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector <vector<int>> vecRes(n, vector<int>(n, 0));
int iStartx = 0;
int iStarty = 0;
int iLoop = n / 2;
int iCount = 1;
int iOffset = 1;
int i,j;
while(iLoop--)
{
i = iStartx;
j = iStarty;
for(j; j < n - iOffset; j++)
{
vecRes[i][j] = iCount++;
}
for(i; i < n - iOffset; i++)
{
vecRes[i][j] = iCount++;
}
for(j; j > iStarty; j--)
{
vecRes[i][j] = iCount++;
}
for(i; i > iStartx; i--)
{
vecRes[i][j] = iCount++;
}
iStartx++;
iStarty++;
iOffset++;
}
if(n%2)
{
int iMid = n/2;
vecRes[iMid][iMid] = iCount;
}
return vecRes;
}
};