代码随想录二刷——数组day2

文章目录

  • 前言
    • 数组知识点
  • 一、 977. 有序数组的平方
  • 二、209. 长度最小的子数组
  • 三、59. 螺旋矩阵 II
  • 总结


前言

一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油!
二刷决定精刷了,于是参加了卡子哥的刷题班,训练营为期60天,我一定能坚持下去,迎来两个月后的脱变的,加油!
推荐一手卡子哥的刷题网站,感谢卡子哥。代码随想录

数组知识点

数组是存放在连续内存空间上的相同类型数据的集合。
数组下标都是从0开始的。
数组内存空间的地址是连续的。二维数组一样如此。
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。数组的元素是不能删的,只能覆盖。
vector的底层实现是array,严格来讲vector是容器,不是数组。

一、 977. 有序数组的平方

977. 有序数组的平方
Note:暴力解题

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            nums[i] *= nums[i];
        }
        sort(nums.begin(), nums.end());
        return nums;
    }
};

Note:双指针,新建数组从尾至头塞数

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int size = nums.size() - 1;
        vector<int> result(size + 1, 0);
        for (int i = 0, j = nums.size() - 1; i <= j;) {
            if (nums[i] * nums[i] < nums[j] * nums[j]) {
                result[size--] = nums[j] * nums[j];
                j--;
            } else {
                result[size--] = nums[i] * nums[i];
                i++;
            }
        }
        return result;
    }
};

二、209. 长度最小的子数组

209. 长度最小的子数组

Note:暴力/滑动窗口
暴力(会超时):

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0;
        int length = 0;

        for (int i = 0; i < nums.size(); i++) {
            sum = 0;
            for (int j = i; j < nums.size(); j++) {
                sum += nums[j];
                if (sum >= target) {
                    length = j - i + 1;
                    result = result < length ? result : length;
                    break;
                }
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

滑动窗口,其实也是一种双指针

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0;
        int length = 0;
        for (int i = 0, j = 0; j < nums.size(); j++) {
            sum += nums[j];
            while (sum >= target) {
                length = j - i + 1;
                result = result < length ? result : length;
                sum -= nums[i++];
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

三、59. 螺旋矩阵 II

59. 螺旋矩阵 II

Note:模拟大法好

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0;
        int length = 0;

        for (int i = 0; i < nums.size(); i++) {
            sum = 0;
            for (int j = i; j < nums.size(); j++) {
                sum += nums[j];
                if (sum >= target) {
                    length = j - i + 1;
                    result = result < length ? result : length;
                    break;
                }
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

总结

写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

你可能感兴趣的:(代码随想录刷刷刷,学习,leetcode,c++,算法)