数据结构设计高频题目

题目1 : setAll功能的哈希表

cpp 复制代码
#include <iostream>
#include <unordered_map>
#include <vector>

using namespace std;

int cnt = 0;
int setAllValue = 0;
int setAllTimes = -1;

unordered_map<int, pair<int, int>> map;

void put(int key, int val) {
    if (map.find(key) != map.end()) {
        // 如果已经存在,则更新值和次数
        map[key].first = val;
        map[key].second = cnt++;
    } else {
        // 如果不存在,则插入新键值对
        map[key] = {val, cnt++};
    }
}

int get(int key) {
    if (map.find(key) == map.end()) {
        return -1;
    }
    auto& value = map[key];
    if (value.second > setAllTimes) {
        return value.first;
    } else {
        return setAllValue;
    }
}

void setAll(int val) {
    setAllValue = val;
    setAllTimes = cnt++;
}

int main() {
    put(1, 1);
    cout << get(1) << endl; // 输出: 1
    setAll(2);
    cout << get(1) << endl; // 输出: 2
    return 0;
}

题目2 : 实现LRU结构

LRU结构就是,

可以使用HashMap和双向链表来实现,

题目3 : 插入、删除和获取随机元素O(1)时间的结构

题目4 : 插入、删除和获取随机元素O(1)时间且允许有重复数字的结构

cpp 复制代码
#include <iostream>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

class InsertDeleteRandom {
public:
    bool insert(int val) {
        // 数组中插入元素
        vec.push_back(val);
        // 记录下标
        int idx = vec.size() - 1;
        unordered_set<int>& set = map[val];
        set.insert(idx);

        return set.size() == 1;
    }

    bool remove(int val) {
        if (map.find(val) == map.end()) {
            return false;
        }
        unordered_set<int>& valSet = map[val];
        int valueIdx = *valSet.begin();
        int endValue = vec.back();
        if (val == endValue) {
            // 如果要删除的值刚好在数组末尾
            valSet.erase(vec.size() - 1);
        } else {
            unordered_set<int>& endValueSet = map[endValue];
            vec[valueIdx] = endValue;  // 将数组末尾的值移动到要删除的位置
            endValueSet.insert(valueIdx);  // 更新数组末尾值的下标
            endValueSet.erase(vec.size() - 1);  // 删除数组末尾值的下标
            valSet.erase(valueIdx);  // 删除要删除的值在数组中的下标
        }
        vec.pop_back();  // 删除数组末尾的值
        if (valSet.empty()) {
            map.erase(val);  // 如果要删除的值在数组中不存在,则从哈希表中移除
        }
        return true;
    }

    int getRandom() {
        int randomIdx = rand() % vec.size();
        return vec[randomIdx];
    }

    // 打印数组
    void print() const {
        cout << "print vec: ";
        for (int num : vec) {
            cout << num << " ";
        }
        cout << endl;
    }
private:
    unordered_map<int, unordered_set<int>> map;
    vector<int> vec;
};

int main() {
    srand((unsigned int)time(nullptr));
    InsertDeleteRandom idr;
    cout << boolalpha;
    cout << idr.insert(1) << endl;
    cout << idr.insert(1) << endl;
    cout << idr.insert(2) << endl;
    cout << idr.remove(3) << endl;
    idr.print();
    cout << idr.insert(4) << endl;
    cout << idr.remove(1) << endl;
    idr.print();
    cout << idr.getRandom() << endl;    
    cout << idr.getRandom() << endl;

    return 0;
}

题目5 : 快速获得数据流的中位数的结构

当大根堆为空或者数据小于等于大根堆的堆顶的值时,加入大根堆,其余数据加入小根堆,当大小根堆的元素数量差大于1时,就需要调整,始终保持大小根堆的元素差值小于等于1。

cpp 复制代码
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

class FindMedian {
public:
    void addNum(int num) {
        if (maxHeap.empty() || num <= maxHeap.top()) {
            maxHeap.push(num);
        } else {
            minHeap.push(num);
        }
        balance();
    }

    double findMedian() {
        if (maxHeap.size() == minHeap.size()) {
            return (maxHeap.top() + minHeap.top()) / 2.0;
        } else {
            return maxHeap.size() > minHeap.size() ? maxHeap.top() : minHeap.top();
        }
    }

private:
    priority_queue<int, vector<int>, less<int>> maxHeap;
    priority_queue<int, vector<int>, greater<int>> minHeap;

    void balance() {
        if (maxHeap.size() >= minHeap.size() + 2) {
            minHeap.push(maxHeap.top());
            maxHeap.pop();
        } else if (minHeap.size() >= maxHeap.size() + 2) {
            maxHeap.push(minHeap.top());
            minHeap.pop();
        }
    }
};

题目6 : 最大频率栈

题目7 : 全O(1)的数据结构

相关推荐
历程里程碑5 小时前
滑动窗口---- 无重复字符的最长子串
java·数据结构·c++·python·算法·leetcode·django
派大鑫wink6 小时前
【Day61】Redis 深入:吃透数据结构、持久化(RDB/AOF)与缓存策略
数据结构·redis·缓存
独处东汉7 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
放荡不羁的野指针7 小时前
leetcode150题-滑动窗口
数据结构·算法·leetcode
BHXDML8 小时前
数据结构:(一)从内存底层逻辑理解线性表
数据结构
小龙报8 小时前
【C语言进阶数据结构与算法】单链表综合练习:1.删除链表中等于给定值 val 的所有节点 2.反转链表 3.链表中间节点
c语言·开发语言·数据结构·c++·算法·链表·visual studio
Anastasiozzzz8 小时前
LeetCode Hot100 215. 数组中的第K个最大元素
数据结构·算法·leetcode
xuedingbue10 小时前
数据结构与顺序表:高效数据管理秘籍
数据结构·算法·链表
啊阿狸不会拉杆10 小时前
《数字信号处理 》第 7 章-无限长单位冲激响应 (IIR) 数字滤波器设计方法
数据结构·算法·信号处理·数字信号处理·dsp
挽天java11 小时前
数据结构习题--寻找旋转排序数组中的最小值
数据结构·算法·排序算法