[Swift]LeetCode398. 随机数索引 | Random Pick Index
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10306011.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
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);
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。
示例:
int[] nums = new int[] {1,2,3,3,3}; Solution solution = new Solution(nums); // pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。 solution.pick(3); // pick(1) 应该返回 0。因为只有nums[0]等于1。 solution.pick(1);
792ms
1 class Solution { 2 var v:[Int] = [Int]() 3 4 init(_ nums: [Int]) { 5 v = nums 6 } 7 8 func pick(_ target: Int) -> Int { 9 var cnt:Int = 0 10 var res:Int = -1 11 for i in 0..<v.count 12 { 13 if v[i] != target {continue} 14 cnt += 1 15 if Int.random(in: 0...Int.max) % cnt == 0 16 { 17 res = i 18 } 19 } 20 return res 21 } 22 } 23 24 /** 25 * Your Solution object will be instantiated and called as such: 26 * let obj = Solution(nums) 27 * let ret_1: Int = obj.pick(target) 28 */ 29
824ms
1 class Solution { 2 3 let nums: [Int] 4 let numSize: Int 5 6 init(_ nums: [Int]) { 7 self.nums = nums 8 numSize = nums.count 9 } 10 11 func pick(_ target: Int) -> Int { 12 for i in 0..<numSize { 13 let idx = Int.random(in: 0..<numSize-i) + i 14 if nums[idx] == target { 15 return idx 16 } 17 if nums[i] == target { 18 return i 19 } 20 } 21 22 return 0 23 } 24 }
916ms
1 class Solution { 2 var map:[Int: [Int]] = [:] 3 4 init(_ nums: [Int]) { 5 map = [:] 6 for i in 0 ..< nums.count { 7 var array = map[nums[i]] 8 if array == nil { 9 array = [] 10 } 11 array!.append(i) 12 map[nums[i]] = array 13 } 14 } 15 16 func pick(_ target: Int) -> Int { 17 if let array = map[target] { 18 let size = array.count 19 let r = Int.random(in: 0 ..< size) 20 return array[r] 21 } 22 return -1 23 } 24 }
940ms
1 class Solution { 2 var d: [Int: [Int]] = [:] 3 4 init(_ nums: [Int]) { 5 for (i, num) in nums.enumerated() { 6 if let some = d[num] { 7 d[num] = some + [i] 8 } else { 9 d[num] = [i] 10 } 11 } 12 } 13 14 func pick(_ target: Int) -> Int { 15 let arr = d[target]! 16 var randI = Int.random(in: 0..<arr.count) 17 return arr[randI] 18 } 19 }
952ms
1 class Solution { 2 3 private let numsIndices: [Int: [Int]] 4 5 init(_ nums: [Int]) { 6 var idxMap = [Int: [Int]]() 7 for (offset, num) in nums.enumerated() { 8 if idxMap[num] == nil { idxMap[num] = [Int]() } 9 idxMap[num]?.append(offset) 10 } 11 numsIndices = idxMap 12 } 13 14 func pick(_ target: Int) -> Int { 15 return numsIndices[target]!.randomElement()! 16 } 17 }
1020ms
1 class Solution { 2 3 var mapping = [Int: [Int]]()//key is the number, value is the index array 4 init(_ nums: [Int]) { 5 for i in 0..<nums.count{ 6 if var indexArray = mapping[nums[i]]{ 7 indexArray.append(i) 8 mapping[nums[i]] = indexArray 9 } else{ 10 mapping[nums[i]] = [i] 11 } 12 } 13 } 14 15 func pick(_ target: Int) -> Int { 16 if let indexArray = mapping[target]{ 17 return indexArray.randomElement()! 18 } 19 return -1 20 } 21 }
1172ms
1 class Solution { 2 3 var nums: [Int] 4 5 init(_ nums: [Int]) { 6 self.nums = nums 7 } 8 9 func pick(_ target: Int) -> Int { 10 let array = self.nums.enumerated().shuffled() 11 for i in stride(from: 0, to: array.count, by: 1) { 12 if i >= array.count { 13 return -1 14 } 15 if array[i].element == target { 16 print(array[i].offset) 17 return array[i].offset 18 } 19 } 20 return -1 21 } 22 }