代码随想录第二期 | Day2 - 数组理论基础

71 阅读2分钟

有序数组的平方

题目链接: leetcode.cn/problems/sq…

解题思路

  1. 遍历整个数组,定义一个长度为数组长度的空数组。
  2. 每次遍历的过程中,判断后面一个元素和前面一个元素的大小
  3. 将头尾两个元素中比较大的那一个放入空数组的末尾
  4. 遍历完整之后,返回新建的数组

代码实现

// 双指针法
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int k=nums.size()-1;
        vector<int> ret(nums.size(),0);
        for(int i=0,j=nums.size()-1;i<=j;){
            if(abs(nums[i])<abs(nums[j])){
                ret[k--]=pow(nums[j],2);
                j--;
            }
            else{
                ret[k--]=pow(nums[i],2);
                i++;
            }
        }
        return ret;
    }
};
// 暴力
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            nums[i]=nums[i]*nums[i];
        }
        sort(nums.begin(),nums.end());
        return nums;
    }
};

长度最小的子数组

题目链接: leetcode.cn/problems/mi…

实现思路

  1. 首先我们得到一个数组和一个目标值
  2. 我们将数组进行遍历操作,定义最后要返回的值result,和中间的操作量subLength
  3. 定义一个变量j为滑动窗口的尾节点。每次我们得到的区间数组和如果说大于target的话,那么我们就对其进行删除头操作
  4. 最后将遍历数组过程中得到的result给他返回回去

代码实现

// 滑动窗口实现
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=INT_MAX;
        int i=0;
        int sum=0;
        int subLength=0;
        for(int j=0;j<nums.size();j++){
            sum+=nums[j];
            while(sum>=target){
                subLength=(j-i+1);
                result=min(result,subLength);
                sum-=nums[i++];
            }
        }
        return result==INT_MAX?0:result;
    }
};

螺旋矩阵II

题目链接: leetcode.cn/problems/sp…

代码实现

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
        int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
        int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
        int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
        int count = 1; 
        int offset = 1; 
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;
            for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }
            for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            for (; i > startx; i--) {
                res[i][j] = count++;
            }

            startx++;
            starty++;

            offset += 1;
        }

        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};