【Leetcode】Insert Delete GetRandom O(1) - Duplicates allowed

本文介绍了一种支持插入、删除及随机返回元素的数据结构实现,该结构允许元素重复,并确保平均时间复杂度为 O(1)。通过使用列表存储元素并结合哈希集合维护元素索引,实现了高效的元素管理和随机访问。

题目链接:https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/

题目:

Design a data structure that supports all following operations in average O(1) time.

Note: Duplicate elements are allowed.

  1. insert(val): Inserts an item val to the collection.
  2. remove(val): Removes an item val from the collection if present.
  3. getRandom: Returns a random element from current collection of elements. The probability of each element being returned is linearly related to the number of same value the collection contains.

Example:

// Init an empty collection.
RandomizedCollection collection = new RandomizedCollection();

// Inserts 1 to the collection. Returns true as the collection did not contain 1.
collection.insert(1);

// Inserts another 1 to the collection. Returns false as the collection contained 1. Collection now contains [1,1].
collection.insert(1);

// Inserts 2 to the collection, returns true. Collection now contains [1,1,2].
collection.insert(2);

// getRandom should return 1 with the probability 2/3, and returns 2 with the probability 1/3.
collection.getRandom();

// Removes 1 from the collection, returns true. Collection now contains [1,2].
collection.remove(1);

// getRandom should return 1 and 2 both equally likely.
collection.getRandom();

Subscribe to see which companies asked this question

思路:

跟上一题不同点在于允许插入重复元素,我们仍然用list存储插入元素,用hashmap维护元素与下标之间的对应关系,不同点在于我们用一个集合存储某元素所有下标(因为可能有重复元素插入,但它们是按序插入list的即下标是不同的),那么接下来考虑用什么集合存储某元素的所有下标呢?

首先考虑list,但当我们remove某元素时,需要更新某元素的下标集合,此时用list,时间复杂度为O(n)。

考虑set,因为是按序插入list的,即下标是不同的,hashset可以存储,且remove操作时间复杂度为O(1)。

算法:

  /** Initialize your data structure here. */
    public RandomizedCollection() {
        
    }
    List<Integer> vals = new ArrayList<Integer>();
	Map<Integer, Set<Integer>> val2idx = new HashMap<Integer, Set<Integer>>();

    /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
    public boolean insert(int val) {
        boolean flag = false;
        Set<Integer> idxs = null;
        if (val2idx.containsKey(val)) {
            idxs = val2idx.get(val);
			flag=false;
		} else {
		    idxs = new HashSet<Integer>();
			flag=true;
		}
		idxs.add(vals.size());
        vals.add(val);
        val2idx.put(val,idxs);
		return flag;
    }
    
    /** Removes a value from the collection. Returns true if the collection contained the specified element. */
    public boolean remove(int val) {
        if (!val2idx.containsKey(val)) {
			return false;
		} else {
		    Set<Integer> rmIdxs = val2idx.get(val);
		    int rmIdx = rmIdxs.iterator().next();//被删除元素的下标
			if (rmIdx < vals.size() - 1&&val!=vals.get(vals.size()-1)) {//若刪除的不是末尾元素,且被刪除元素不等于末尾元素(若相等的话就当做删除末尾
				// 将末尾元素存入被删除元素的位置,并更新相应下标
				int lastElem = vals.get(vals.size() - 1);//末尾元素
				Set<Integer> lastElemIdxs = val2idx.get(lastElem);//末尾元素的index集合
				lastElemIdxs.remove(vals.size()-1);
				lastElemIdxs.add(rmIdx);
				vals.set(rmIdx,lastElem);
				val2idx.put(lastElem,lastElemIdxs);
			}
			rmIdxs.remove(rmIdx);
			if(rmIdxs.size()==0){
				val2idx.remove(val);
			}else{
				val2idx.put(val,rmIdxs);
			}
			vals.remove(vals.size() - 1);
			return true;
		}
    }
    
   	Random r = new Random();
	public int getRandom() {
		return vals.get(r.nextInt(vals.size()));
	}


内容概要:本文系统阐述了正规表达式(正则表达式)作为词法分析核心工具的理论基础与实际应用。文章从字母表、符号串等基本概念出发,详细介绍了正规式的定义、运算规则、代数性质及其与有限自动机(NFA/DFA)的等价关系,阐明了通过Thompson构造法、子集构造法和DFA最小化实现词法分析器自动生成的技术路径。同时,文中列举了标识符、关键字、运算符等编程语言元素的正规式描述,并说明了最长匹配和优先级规则在歧义消解中的作用。此外,还对比了正规式与上下文无关文法的表达能力差异,指出了其在嵌套结构和计数能力上的局限性,并介绍了Lex/Flex等词法分析器生成工具的应用场景。; 适合人群:计算机相关专业学生、编译原理初学者、希望深入理解词法分析机制的研发人员;具备一定的离散数学和形式语言基础者更佳。; 使用场景及目标:① 学习如何使用正规表达式精确描述程序语言的词法规则;② 掌握从正规式到DFA的转换流程及其实现原理,为构建编译器前端打下基础;③ 理解词法分析器生成工具的工作机制,提升对自动化工具的理解与运用能力。; 阅读建议:建议结合编译器设计实践进行学习,尝试手动完成正规式到NFA再到DFA的转换练习,并使用Flex等工具验证结果,以加深对理论知识的理解与应用。
内容概要:本文针对高比例清洁能源接入背景下配电网重构的关键问题,提出了一种计及需求响应机制的优化方法,并以IEEE33节点标准系统为案例,采用Matlab进行建模、仿真与代码实现。研究通过构建综合考虑风电、光伏等间歇性电源出力不确定性和负荷波动的数学模型,引入智能优化算法求解网络重构方案,有效提升了配电网对清洁能源的接纳能力与运行的经济性、可靠性。文中重点探讨了需求响应在削峰填谷、平抑波动方面的作用,实现了网络结构的动态优化调整,为新型电力系统下的主动配电网管理提供了可行的技术路径和仿真验证平台。该工作属于电力系统智能优化领域的前沿实践,具有较强的理论价值与工程应用前景。; 适合人群:具备电力系统分析、优化算法基础及Matlab编程能力,从事新能源并网、智能电网、需求响应等相关方向研究的研究生、科研人员及电力行业工程技术人员。; 使用场景及目标:①应用于高渗透率可再生能源接入的配电网运行优化研究;②为需求响应参与下的网络重构问题提供完整的算法设计与Matlab仿真解决方案;③服务于IEEE标准测试系统的教学演示、科研验证及算法对比分析。; 阅读建议:建议读者结合提供的Matlab代码深入理解模型构建与求解流程,动手运行仿真程序并尝试调整参数,以掌握不同场景下重构策略的变化规律,同时可进一步拓展至多时段动态重构、加入储能系统或电动汽车等新型负荷进行深化研究。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值