Leetcode:Insert Delete GetRandom O(1)

来源:互联网 发布:java list 拼接字符串 编辑:程序博客网 时间:2024/06/06 00:56

链接:

https://leetcode.com/problems/insert-delete-getrandom-o1/#/description

题目描述:

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

insert(val): Inserts an item val to the set if not already present.remove(val): Removes an item val from the set if present.getRandom: Returns a random element from current set of elements. Each element must have the same probability of being returned.

解题思路:

该题目第一反应是需要使用map 或者set(set 内部实现也是map)的数据结构。使用map可以支持insert和remove操作,但是要完成getRandom操作就不行了。为了解决getRandom的问题,我们可以选择map和list组合,map存储val和位置的映射关系,list存储val.
注意:
1. 删除的时候需要支持O(1)操作,对于数组如果从中间删除元素,那么后面的元素都需要向前移动,所以使用小技巧,用list中最后的元素替换要删除的元素,然后删除最后的元素。2. 删除元素的时候注意更新map元素的映射位置。

代码如下:

public class RandomizedSet {    private Map<Integer,Integer> cache;    private List<Integer> elements;    private Random random;    /** Initialize your data structure here. */    public RandomizedSet() {        cache = new HashMap<Integer,Integer>();        elements = new ArrayList<>();        random = new Random();    }    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */    public boolean insert(int val) {        if(cache.containsKey(val)) return false;        cache.put(val,elements.size());        elements.add(val);        return true;    }    /** Removes a value from the set. Returns true if the set contained the specified element. */    public boolean remove(int val) {        if(!cache.containsKey(val)) return false;        int index = cache.get(val);        int size = elements.size();        if(index!=size-1){            int last = elements.get(size-1);            elements.set(index,last);            cache.put(last,index);        }        elements.remove(size-1);        cache.remove(val);        return true;    }    /** Get a random element from the set. */    public int getRandom() {        int index = random.nextInt(elements.size());        return elements.get(index);    }}
原创粉丝点击