[Leetcode] 381. Insert Delete GetRandom O(1) - Duplicates allowed
381. Insert Delete GetRandom O(1) - Duplicates allowed
https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/description/
这个是上一道题升级版,难度也变成了hard,看来不可小觑!
看着和第一道题没啥区别,实际上区别大了!上一道题我们用hashset,这个东西key不能重复啊。我已开始想的是key指向的value换成list,list里面是一堆position,后来发现insert 还好办,delete不是常数复杂度啊,没办法,只能key里面再来一个hashMap了。坚持不看答案,以看答案为耻,恩!我发现自己太依赖答案了。从现在起,自己做,实在不行了再看答案。还有就是要强迫自己总结,不然都熊瞎子掰苞米了,简直了。这道题的考点上来说和上一道题一样的,都是hash map和list,目前看来是这样,只是更复杂了一点。仔细想了一下也不对啊,如果list of position的话也没什么不妥,反正,每个position的值一样,随便拿掉一个就行了嘛。最后看看list of posittion里面剩下东西没有,没剩下的话把那个hashMap entry 删除
以后每道题都自己做,有思路的就坚决不看答案。长时间没有思路的看思路,然后还是自己写出来,不然依赖答案太严重了!一定要独立!
这道题随机读取要于数字的个数成比例,这个好办,就把hashMap里面东西拿出来,然后放进一个list,然后和第一题一样随机读取就行了。但是这样有额外的空间要占用,所以,做完之后看看答案有没有啥好办法。
确实尝试独立来着,结果两天也没搞出来,基本思路对的,但是就是implement不出来。难度不高,但是需要炒鸡细心,我的错误是吧其中应该放在括号外面的一行放在了括号里面。导致错的很离谱。 用了一堆println 才搞定,最后两是print的函数,大家需要的话调用好了。
AC Solution:
https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed/description/
这个是上一道题升级版,难度也变成了hard,看来不可小觑!
看着和第一道题没啥区别,实际上区别大了!上一道题我们用hashset,这个东西key不能重复啊。我已开始想的是key指向的value换成list,list里面是一堆position,后来发现insert 还好办,delete不是常数复杂度啊,没办法,只能key里面再来一个hashMap了。坚持不看答案,以看答案为耻,恩!我发现自己太依赖答案了。从现在起,自己做,实在不行了再看答案。还有就是要强迫自己总结,不然都熊瞎子掰苞米了,简直了。这道题的考点上来说和上一道题一样的,都是hash map和list,目前看来是这样,只是更复杂了一点。仔细想了一下也不对啊,如果list of position的话也没什么不妥,反正,每个position的值一样,随便拿掉一个就行了嘛。最后看看list of posittion里面剩下东西没有,没剩下的话把那个hashMap entry 删除
以后每道题都自己做,有思路的就坚决不看答案。长时间没有思路的看思路,然后还是自己写出来,不然依赖答案太严重了!一定要独立!
这道题随机读取要于数字的个数成比例,这个好办,就把hashMap里面东西拿出来,然后放进一个list,然后和第一题一样随机读取就行了。但是这样有额外的空间要占用,所以,做完之后看看答案有没有啥好办法。
确实尝试独立来着,结果两天也没搞出来,基本思路对的,但是就是implement不出来。难度不高,但是需要炒鸡细心,我的错误是吧其中应该放在括号外面的一行放在了括号里面。导致错的很离谱。 用了一堆println 才搞定,最后两是print的函数,大家需要的话调用好了。
AC Solution:
public class RandomizedCollection { // Integer key is the value HashMap<Integer, HashSet<Integer>> map; List<Integer> list; int size; /** Initialize your data structure here. */ public RandomizedCollection() { map = new HashMap<Integer, HashSet<Integer>>(); list = new ArrayList<Integer>(); size = 0; } /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */ public boolean insert(int val) { if(map.containsKey(val)){ map.get(val).add(size); list.add(size++, val); return false; }else{ HashSet<Integer> newSet = new HashSet<Integer>(); newSet.add(size); map.put(val, newSet); list.add(size++, val); } return true; } /** Removes a value from the collection. Returns true if the collection contained the specified element. */ public boolean remove(int val) { if(!map.containsKey(val)){ return false; } HashSet<Integer> valSet = map.get(val); System.out.println(valSet); int listPos = valSet.iterator().next(); int tailKey = list.get(size -1); HashSet<Integer> tailKeySet = map.get(tailKey); list.set(listPos, tailKey); if(valSet.size() <= 1){ map.remove(val); } else{ valSet.remove(listPos); } tailKeySet.add(listPos); tailKeySet.remove(size-1); list.remove(size-1); size--; return true; } /** Get a random element from the collection. */ public int getRandom() { Random rand = new Random(); return list.get(rand.nextInt(size)); } public void printList(){ System.out.println("List:"); System.out.println(list); } public void printMap(){ System.out.println("Map:"); System.out.println(map); } }
Comments
Post a Comment