leetcode 384. Shuffle an Array 数组随机洗牌

缺乏、安全感 2022-06-07 02:51 342阅读 0赞

Shuffle a set of numbers without duplicates.

Example:

// Init an array with set 1, 2, and 3.
int[] nums = {1,2,3};
Solution solution = new Solution(nums);

// Shuffle the array [1,2,3] and return its result. Any permutation of [1,2,3] must equally likely to be returned.
solution.shuffle();

// Resets the array back to its original configuration [1,2,3].
solution.reset();

// Returns the random shuffling of array [1,2,3].
solution.shuffle();

网上看到的代码,就这么吧!

代码如下:

  1. public class Solution {
  2. private int[] nums = null;
  3. private Random random = null;
  4. public Solution(int[] nums) {
  5. this.nums = nums;
  6. random = new Random();
  7. }
  8. /** Resets the array to its original configuration and return it. */
  9. public int[] reset() {
  10. return nums;
  11. }
  12. /** Returns a random shuffling of the array. */
  13. public int[] shuffle() {
  14. if(nums == null) return null;
  15. int[] a = (int[])nums.clone();
  16. for(int i = 1; i < nums.length; i++){
  17. int j = random.nextInt(i + 1);
  18. swap(a, i, j);
  19. }
  20. return a;
  21. }
  22. private void swap(int[] a, int i, int j){
  23. int temp = a[i];
  24. a[i] = a[j];
  25. a[j] = temp;
  26. }
  27. }
  28. /**
  29. * Your Solution object will be instantiated and called as such:
  30. * Solution obj = new Solution(nums);
  31. * int[] param_1 = obj.reset();
  32. * int[] param_2 = obj.shuffle();
  33. */

下面是C++的做法

这道题让我们给数组洗牌,也就是随机打乱顺序,那么由于之前那道题leetcode 382. Linked List Random Node 等概率随机获取结点 + 蓄水池算法我们接触到了水塘抽样的思想,这道题实际上这道题也是用类似的思路,我们遍历数组每个位置,每次都随机生成一个坐标位置,然后交换当前遍历位置和随机生成的坐标位置的数字,这样如果数组有n个数字,那么我们也随机交换了n组位置,从而达到了洗牌的目的,这里需要注意的是i + rand() % (res.size() - i)不能写成rand() % res.size(),虽然也能通过OJ,但是根据这个帖子的最后部分的概率图表,前面那种写法不是真正的随机分布,应该使用Knuth shuffle算法,感谢热心网友们的留言,

代码如下:

  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <unordered_map>
  5. #include <set>
  6. #include <unordered_set>
  7. #include <queue>
  8. #include <stack>
  9. #include <string>
  10. #include <climits>
  11. #include <algorithm>
  12. #include <sstream>
  13. #include <functional>
  14. #include <bitset>
  15. #include <numeric>
  16. #include <cmath>
  17. #include <regex>
  18. using namespace std;
  19. class Solution
  20. {
  21. public:
  22. vector<int> v;
  23. Solution(vector<int> nums)
  24. {
  25. v = nums;
  26. }
  27. /** Resets the array to its original configuration and return it. */
  28. vector<int> reset()
  29. {
  30. return v;
  31. }
  32. /** Returns a random shuffling of the array. */
  33. vector<int> shuffle()
  34. {
  35. vector<int> res = v;
  36. for (int i = 0; i < res.size(); i++)
  37. {
  38. int t = i + rand() % (res.size() - i);
  39. swap(res[i], res[t]);
  40. }
  41. return res;
  42. }
  43. };
  44. /**
  45. * Your Solution object will be instantiated and called as such:
  46. * Solution obj = new Solution(nums);
  47. * vector<int> param_1 = obj.reset();
  48. * vector<int> param_2 = obj.shuffle();
  49. */

发表评论

表情:
评论列表 (有 0 条评论,342人围观)

还没有评论,来说两句吧...

相关阅读