力扣209,长度最小的子数组
本题主要使用滑动窗口,注意滑动窗口的写法
整体代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int res = INT32_MAX;
int left = 0;//滑动窗口的左端
int sum = 0;//滑动窗口的总和
int len = 0;//滑动窗口的长度
for (int right = 0; right < nums.size(); right++) {
sum += nums[right];
while (sum >= target) {
//更新滑动窗口的长度
len = right - left + 1;
//更新res
res = res > len ? len : res;
//更新滑动窗口的左端
sum -= nums[left];
left++;
}
}
return res == INT32_MAX ? 0 : res;
}
};
力扣59,螺旋矩阵Ⅱ
首先要注意区间是左闭右开遍历,其次就是考虑各个边界情况,从外向内一圈一圈遍历,
整体代码
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startx, starty = 0;//起始位置
int count = 1;//计数
int loop = n / 2;//循环的圈数
int mid = n / 2;//中间位置,n为奇数的时候,矩阵中心位置要单独赋值
int offset = 1;//每循环一圈,右边界-1
int i,j;
while (loop--) {
i = startx;
j = starty;
//上面的一条边
for (; j < n - offset; j++) {
res[startx][j] = count++;
}
//右边的一条边
for (; 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;
}
};
力扣28,找出字符串中第一个匹配项的下标
本题考查的是KMP算法,其核心就是求子串的前缀数组,
//生成前缀数组
void getNext(int * next, const string& s) {
int j = 0;
next[0] = 0;
for (int i = 1; i < s.size(); j++) {
//i,j不匹配的情况
while (j > 0 && s[i] != s[j]) {
j = next[j - 1];
}
//i,j匹配的情况
if (s[i] == s[j]) {
j++;
}
next[i] = j;
}
}
求出前缀数组后,匹配字符串的过程也是和求前缀数组的过程一样
class Solution {
public:
//获取next数组
void getNext(int* next, const string& s) {
//1、初始化
int j = 0;
next[0] = 0;
for(int i = 1; i < s.size(); i++) {
//2、前后缀不同的情况
while(j > 0 && s[i] != s[j]) {
j = next[j - 1];
}
//3、前后缀相同的情况
if(s[i] == s[j]) {
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
//利用next数组来匹配
int next[needle.size()];
getNext(next, needle);
int j = 0;
for(int i = 0; i < haystack.size(); i++) {
while(j > 0 && haystack[i] != needle[j]) {
j = next[j - 1];
}
if(haystack[i] == needle[j]) {
j++;
}
if(j == needle.size()) {
return (i - needle.size() + 1);
}
}
return -1;
}
};