美文网首页
398. Random Pick Index

398. Random Pick Index

作者: Nancyberry | 来源:发表于2018-05-27 06:19 被阅读0次

    Description

    Given an array of integers with possible duplicates, randomly output the index of a given target number. You can assume that the given target number must exist in the array.

    Note:
    The array size can be very large. Solution that uses too much extra space will not pass the judge.

    Example:

    int[] nums = new int[] {1,2,3,3,3};
    Solution solution = new Solution(nums);
    
    // pick(3) should return either index 2, 3, or 4 randomly. Each index should have equal probability of returning.
    solution.pick(3);
    
    // pick(1) should return 0\. Since in the array only nums[0] is equal to 1.
    solution.pick(1);
    

    Solution

    HashMap + nextInt, constructor O(n), pick O(1), S(n)

    class Solution {
        private Map<Integer, List<Integer>> map;
        private Random random;
        
        public Solution(int[] nums) {
            map = new HashMap<>();
            random = new Random();
            
            for (int i = 0; i < nums.length; ++i) {
                if (!map.containsKey(nums[i])) {
                    map.put(nums[i], new ArrayList<>());
                }
                map.get(nums[i]).add(i);
            }
        }
        
        public int pick(int target) {
            if (!map.containsKey(target)) {
                return -1;
            }
            
            int index = random.nextInt(map.get(target).size());
            return map.get(target).get(index);
        }
    }
    
    /**
     * Your Solution object will be instantiated and called as such:
     * Solution obj = new Solution(nums);
     * int param_1 = obj.pick(target);
     */
    

    Reservoir sampling, constructor O(1), pick O(n), S(n)

    class Solution {
        private int[] nums;
        private Random random;
        
        public Solution(int[] nums) {
            this.nums = nums;
            random = new Random();
        }
        
        public int pick(int target) {
            int index = -1;
            int count = 0;
            
            for (int i = 0; i < nums.length; ++i) {
                if (nums[i] != target) {
                    continue;
                }   
                
                if (random.nextInt(++count) == 0) {
                    index = i;
                }
            }
            
            return index;
        }
    }
    
    /**
     * Your Solution object will be instantiated and called as such:
     * Solution obj = new Solution(nums);
     * int param_1 = obj.pick(target);
     */
    

    相关文章

      网友评论

          本文标题:398. Random Pick Index

          本文链接:https://www.haomeiwen.com/subject/jnnvjftx.html