三周攻克数据结构第二天

161 阅读1分钟

这是我参与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;
            }
        }
    }
};

\