301-310¶
303. 区域和检索 - 数组不可变¶
前缀和模板题,注意下下标是从0开始的,适当的将前缀和数组右移一位。
class NumArray {
public:
vector<int> ans;
NumArray(vector<int> &nums) {
int n = nums.size();
// 只有声明了容量才能直接使用下标
ans.resize(n + 1);
for (int i = 0; i < n; i++) ans[i + 1] = ans[i] + nums[i];
}
int sumRange(int left, int right) {
return ans[right + 1] - ans[left];
}
};
311-320¶
316. 去除重复字母¶
class Solution {
public:
string removeDuplicateLetters(string s) {
string stk;
// 存放当前字符是否存在stk中
unordered_map<char, bool> box;
// 存放当前字符在整个人字符串的最后位置
unordered_map<char, int> lastIndex;
for (int i = 0; i < s.size(); ++i) lastIndex[s[i]] = i;
for (int i = 0; i < s.size(); ++i) {
if (!box[s[i]]) {
while (stk.size() && s[i] < stk.back() && lastIndex[stk.back()] > i) {
box[stk.back()] = false;
stk.pop_back();
}
stk += s[i];
box[s[i]] = true;
}
}
return stk;
}
};
321-330¶
331-340¶
341-350¶
341. 扁平化嵌套列表迭代器¶
递归写法:
class NestedIterator {
public:
NestedIterator(vector<NestedInteger> &nestedList) {
k=0;
for (auto &itor: nestedList) dfs(itor);
}
void dfs(NestedInteger &next){
if(next.isInteger()) q.push_back(next.getInteger());
else{
for (auto &itor:next.getList()) dfs(itor);
}
}
int next() {
return q[k++];
}
bool hasNext() {
return k<q.size();
}
private:
vector<int> q;
int k;
};
¶
351-360¶
361-370¶
371-380¶
371. 两整数之和¶
加法可以分为两步:
- 使用a^b计算出不带进位的加法
- 使用(a&b)<<1计算出进位
针对每一位二进制,递归上述流程。
class Solution {
public:
int getSum(int a, int b) {
return b==0? a:getSum(a^b,(unsigned int)(a&b)<<1);
}
};
381-390¶
391-400¶
// 本题的主要思想是在不满足单调性的情况下通过增加约束的方式,使得出现单调性。
// 限制住每次子串中不同字母的个数可以保证其出现单调性
class Solution {
public:
int k;
unordered_map<char, int> heap;
void add(char c, int &x, int &y) {
if (!heap[c]) x += 1;
heap[c] += 1;
if (heap[c] == k) y += 1;
}
void del(char c, int &x, int &y) {
if (heap[c] == k) y -= 1;
heap[c] -= 1;
if (!heap[c]) x -= 1;
}
int longestSubstring(string s, int _k) {
k = _k;
int res = 0;
for (int k = 1; k <= 26; ++k) {
heap.clear();
for (int i = 0, j = 0, x = 0, y = 0; i < s.size(); ++i) {
add(s[i], x, y);
while (k < x) del(s[j++], x, y);
if (y == x) res = max(res, i - j + 1);
}
}
return res;
}
};