380. Insert Delete GetRandom O(1)

195 篇文章 0 订阅
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.
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();

Problem URL


Solution

设计一个数据结构,能够实现O(1)时间的插入、删除和随机取值。使用ArrayList存储值,使用HashMap存储值在ArrayList中存放的位置,使用Random获得随机位置。

We could use an ArrayList to store the inserted value. A HashMap for the location of the value stored in the ArrayList, and a random to get random location in the ArrayList.

For the initialize of this data structure. Initializing ArrayList and HashMap. For insert function, checking value is in the hashmap or not. Then recording its location in hashmap and adding it to array list.

For remove function, Checking first. Get the location of the value to be removed, if it is not at the rear of the arraylist, swap it with the last value. That is set removed value in loc to last one and set lastone’s location to removed value’s location. They are set() and put(). After that, we could remove val from hashmap and array list.

For get a random function, randomly get a location in the range of nums’s size and 0.

Code
import java.util.Random;

class RandomizedSet {
    ArrayList<Integer> nums;
    HashMap<Integer, Integer> location;
    Random random = new Random();
    /** Initialize your data structure here. */
    public RandomizedSet() {
        nums = new ArrayList<Integer>();
        location = new HashMap<Integer, Integer>();
    }
    
    /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
    public boolean insert(int val) {
        boolean contain = location.containsKey(val);
        if (contain) return false;
        location.put(val, nums.size());
        nums.add(val);
        return true;
    }
    
    /** Removes a value from the set. Returns true if the set contained the specified element. */
    public boolean remove(int val) {
        boolean contain = location.containsKey(val);
        if (!contain) return false;
        int loc = location.get(val);
        if (loc != nums.size() - 1){
            int lastOne = nums.get(nums.size() - 1);
            nums.set(loc, lastOne);
            location.put(lastOne, loc);//swap num in loc with lastone's value;
        }
        location.remove(val);
        nums.remove(nums.size() - 1);
        return true;
    }
    
    /** Get a random element from the set. */
    public int getRandom() {
        return nums.get(random.nextInt(nums.size()));
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * boolean param_1 = obj.insert(val);
 * boolean param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */

Time Complexity: O(1)
Space Complexity: O(n)


Review

There is follow up question — what if duplicates are allowed.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值