// O(1) 时间插入、删除和获取随机元素 // 学习目标,利用哈希表和动态数组实现高效数据结构 const RandomizedSet = function () { this.nums = [];// 动态数组,储存真实数据,目的是实现O(1)时间内返回随机数据 this.valToIndex = new Map(); // 哈希表,实现O(1)时间内查找,删除,插入 }; /** * @param {number} val * @return {boolean} */ RandomizedSet.prototype.insert = function (val) { // 先判断插入的数据是否已经存在,如果存在直接返回false if (this.valToIndex.has(val)) return false; // 维护插入数据的下标 this.valToIndex.set(val, this.nums.length); this.nums.push(val); return true; }; /** * @param {number} val * @return {boolean} */ RandomizedSet.prototype.remove = function (val) { // 先判断元素是否存在,如果不存在就返回false if (!this.valToIndex.has(val)) return false; // 获取当前元素和最后一个元素的下标 const index = this.valToIndex.get(val); const lastVal = this.nums[this.nums.length - 1]; // 把最后一个元素覆盖到当前位置 this.nums[index] = lastVal; // 更新原本最后一个元素在哈希表中维持的位置 this.valToIndex.set(lastVal, index); // 删除最后一个位置的数据 this.nums.pop(); // 删除当前元素在哈希表中维持的位置 this.valToIndex.delete(val); return true; }; /** * @return {number} */ RandomizedSet.prototype.getRandom = function () { // 引入动态数组的目的就是为了实现O(1)返回随机数据 const randomIndex = Math.floor(Math.random() * this.nums.length); return this.nums[randomIndex]; };