前言
一个本硕双非的小菜鸡,备战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. 长度最小的子数组
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
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)。