文章目录
- 前言
- 数组知识点
- 一、 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)。