这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战
颜色分类
双指针法,用指针 left 来交换 0,right 来交换 1,初始值都为 0。当我们从左向右遍历整个数组时:
- 如果找到了 0,那么将其与 nums[left] 进行交换,并将 left 向后移动一个位置;
- 如果找到了 2,那么将其与 nums[right] 进行交换,并将 right 向前移动一个位置。
class Solution {
public:
void sortColors(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
int i = 0;
while (i <= right){
if(nums[i] == 2){
swap(nums[i],nums[right]);
right--;
}else if(nums[i] == 0){
swap(nums[i],nums[left]);
i++;
left++;
}else{
i++;
}
}
}
};
合并区间
我们用数组 result 存储最终的答案。
- 首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入
result数组中,并按顺序依次考虑之后的每个区间:
- 如果当前区间的左端点在数组
result中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组result的末尾;
- 否则,它们重合,我们需要用当前区间的右端点更新数组
result中最后一个区间的右端点,将其置为二者的较大值。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 0) {
return {};
}
sort(intervals.begin(), intervals.end());
vector<vector<int>> result;
for (int i = 0; i < intervals.size(); ++i) {
int L = intervals[i][0], R = intervals[i][1];
if (!result.size() || result.back()[1] < L) {
result.push_back({L, R});
}
else {
result.back()[1] = max(result.back()[1], R);
}
}
return result;
}
};
设计哈希映射
class MyHashMap {
private:
vector<list<pair<int, int>>> data;
static const int base = 769;
static int hash(int key) {
return key % base;
}
public:
MyHashMap(): data(base) {}
void put(int key, int value) {
int h = hash(key);
for (auto it = data[h].begin(); it != data[h].end(); it++) {
if ((*it).first == key) {
(*it).second = value;
return;
}
}
data[h].push_back(make_pair(key, value));
}
int get(int key) {
int h = hash(key);
for (auto it = data[h].begin(); it != data[h].end(); it++) {
if ((*it).first == key) {
return (*it).second;
}
}
return -1;
}
void remove(int key) {
int h = hash(key);
for (auto it = data[h].begin(); it != data[h].end(); it++) {
if ((*it).first == key) {
data[h].erase(it);
return;
}
}
}
};
\