您的位置:首页 > 编程语言 > Java开发

【Leetcode】380. Insert Delete GetRandom O(1)

2017-02-25 16:00 465 查看
380. Insert Delete GetRandom O(1)

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.

Example:
// Init an empty set.
RandomizedSet randomSet = new RandomizedSet();

// Inserts 1 to the set. Returns true as 1 was inserted successfully.
randomSet.insert(1);

// Returns false as 2 does not exist in the set.
randomSet.remove(2);

// Inserts 2 to the set, returns true. Set now contains [1,2].
randomSet.insert(2);

// getRandom should return either 1 or 2 randomly.
randomSet.getRandom();

// Removes 1 from the set, returns true. Set now contains [2].
randomSet.remove(1);

// 2 was already in the set, so return false.
randomSet.insert(2);

// Since 2 is the only number in the set, getRandom always return 2.
randomSet.getRandom();


Subscribe to see which companies asked this question.
题目简述:
对输入的数据实现,随机读取,插入,删除。。。并且复杂度是O(1)
思路简述:
看了网上的一些blog,大致的思路是 数组+哈希表。
把输入的数据存成两份,一份数组,一份哈希表。在哈希表上存的时候,key=输入的元素,value=元素在数组的索引.这样,删除的时候先去哈希表上找到元素在数组中的索引,然后再去数组中删除(ps:删除的时候,让数组最后一个元素与该元素对调然后删除最后一个元素),就实现了删除操作O(1)。同样,插入O(1)。利用数组特性,随机读取O(1);
代码:
import java.util.Vector;

public class RandomizedSet {

    Map<Integer,Integer> aMap;

    Vector<Integer> aVec;

    //int index;

    

    public RandomizedSet() {

        aMap= new HashMap<Integer,Integer>();

        aVec = new Vector<Integer>();

        //index = 0;

    }

    

    

    public boolean insert(int val) {

        int temp=aVec.size();

        if(!aMap.containsKey(val)){

            aMap.put(val,aVec.size());

            aVec.add(val);

            if(aVec.size()!=temp+1){

                System.out.println("error");

            }

            return true;

        }

        return false;

    }

    

   

    public boolean remove(int val) {

        if(aMap.containsKey(val)){

            int temp = aMap.get(val);

            aVec.set(temp,aVec.get(aVec.size()-1));

            aMap.put(aVec.get(temp),temp);

            

            aMap.remove(val);

            aVec.remove(aVec.size()-1);

            return true;

        }

        return false;

    }

    

    

    public int getRandom() {

        Random rand = new Random();

        //int num = ;

        return aVec.get(rand.nextInt(aVec.size()));

    }

}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Leetcode java