977. 有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
参考题解
思路:暴力法(时间复杂度为O(nlogn))
- 直接对所有数平方
- sort进行排序
思路:双指针法(时间复杂度为O(n))
- 一次遍历即可
基础知识:
209. 长度最小的子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target 的长度最小的 连续
子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
思路: 滑动窗口法
以下为相关题目
涉及滑动窗口
904.水果成篮(opens new window)
76.最小覆盖子串
涉及螺旋矩阵
54.螺旋矩阵(opens new window)
剑指Offer 29.顺时针打印矩阵(opens new window)
59.螺旋矩阵II
给你一个正整数 n
,生成一个包含 1
到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
示例 :
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路: 直接模拟的方法
904. 水果成篮
一刷状态: 只读懂题目, 没想到思路
二刷状态: 具体实现出现问题, 对map的操作不熟练
题解: 还是使用双指针法
Right
从左开始遍历, 直到不满足条件时, 记录当时的值Left
从左开始遍历, 直到水果篮只有一种水果为止Right
继续遍历- 重复以上过程, 直到
Right
和Left
到最右
基础知识:
Map
参考题解
思路:滑动指针
right指针在for循环中进行, 直到遍历至尾部, 整个循环就结束
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int left = 0, right = 0;
int result = 0;
map<int, int> mymap;
for (; right < fruits.size(); right++) {
++mymap[fruits[right]];
if (mymap.size() <= 2) result = max(result, right - left + 1);
while (!(mymap.size() <= 2)) {
--mymap[fruits[left]];
if (mymap[fruits[left]] == 0) mymap.erase(fruits[left]);
left++;
}
}
return result;
}
};
//官方题解
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int left = 0, right = 0;
int result = 0;
map<int, int>mymap;
for (;right < fruits.size();right++) {
mymap[fruits[right]]++;
while (!(mymap.size() <= 2)) {
auto it = mymap.find(fruits[left]);
it->second--;
if (it->second == 0) mymap.erase(it);
left++;
}
result = max(result, right - left + 1);
}
return result;
}
};
76. 最小覆盖子串
给你一个字符串 s
、一个字符串 t
。返回 s
中涵盖 t
所有字符的最小子串。如果 s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
思路:map映射+双指针
- 计算字串中t的数量
class Solution {
public:
bool judgt(const unordered_map<char, int>& mymap) {
for (auto it = mymap.begin(); it != mymap.end(); it++) {
if (!(it->second <= 0)) return false;
}
return true;
}
string minWindow(string s, string t) {
unordered_map<char, int> mymap;
for (int i = 0; i < t.length(); i++) {
mymap[t[i]]++;
}
int left = 0, right = 0;
int result_left = 0, result_right = s.length() + 1;
for (; right < s.length(); right++) {
mymap[s[right]]--;
while (judgt(mymap)) { // 若成立
if (result_right - result_left >= right - left) {// 1.更新
result_left = left;
result_right = right;
}
mymap[s[left]]++;// 2.移动指针
left++;
}
}
string result="";
if (result_right - result_left == s.length() + 1) return result;
for (; result_left <= result_right; result_left++) {
result += s[result_left];
}
return result;
}
};
54. 螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
思路: 模拟的方法, 需要控制边界条件
状态: 没有思考出对中心位置的操作
题解参考
使用边界进行判断, 可用于非方阵的情况
class Solution {
public:
vector<int> spiralArray(vector<vector<int>>& array) {
if (array.empty()) return {};
int l = 0, t = 0, r = array[0].size() - 1, b = array.size() - 1;
vector<int> result;
while (1) {
for (int i = l; i <= r; i++) result.push_back(array[t][i]);
if (++t > b) break;
for (int i = t; i <= b; i++) result.push_back(array[i][r]);
if (--r < l) break;
for (int i = r; i >= l; i--) result.push_back(array[b][i]);
if (--b < t) break;
for (int i = b; i >= t; i--) result.push_back(array[i][l]);
if (++l > r) break;
}
return result;
}
};