算法训练第二天|数组

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值