题目大意:
打乱数组
打乱一个没有重复元素的数组。
示例:
// 以数字集合 1, 2 和 3 初始化数组。 int[] nums = {1,2,3}; Solution solution = new Solution(nums); // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。 solution.shuffle(); // 重设数组到它的初始状态[1,2,3]。 solution.reset(); // 随机返回数组[1,2,3]打乱后的结果。 solution.shuffle();
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=384
解题思路分析:
本题需要实现两个方法,一个是打乱数组,一个是还原数组,因此我们需要在内存中保存两份数组对象,一个作为原始数组的备份,另一个用来打乱。
先看如何打乱数组。所谓打乱,意思就是原先每个位置上的数字会随机变换到其他位置,因此,我们需要循环数组的每一位,然后随机生成一个小于数组长度的数字来代表随机交换的位置,然后我们将当前数字与随机位置上的数字进行交换。循环完每一位的数字之后,也就随机交换了所有位上的数字,到达打乱数组的目的。
对于还原数组就相对简单很多,我们只要将打乱的数组更改为原数组即可。
实现代码:
int[] original; // 原始数组 int[] copy; // 拷贝数组,用于打乱 Random r = new Random(); // 随机 public Solution(int[] nums) { original = nums; copy=Arrays.copyOf(original,original.length); } /** Resets the array to its original configuration and return it. */ public int[] reset() { // 将原始数组复制到copy数组 copy=Arrays.copyOf(original,original.length); return copy; } /** Returns a random shuffling of the array. */ public int[] shuffle() { if(copy.length==0) return copy; // 循环数组每一位 for(int i=copy.length-1;i>=0;i--){ // 当前位的值 int current=copy[i]; // 随机生成一个小于数组长度的下标 int ir = r.nextInt(copy.length); // 交换当前位置与随机下标位置上的数字 copy[i]=copy[ir]; copy[ir]=current; } return copy; }
本题解法执行时间为73ms。
Runtime: 73 ms, faster than 81.45% of Java online submissions for Shuffle an Array.
Memory Usage: 51.2 MB, less than 100.00% of Java online submissions for Shuffle an Array.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-384-shuffle-an-array-解题思路分析/
《LEETCODE 384. Shuffle an Array 解题思路分析》有1条回应