1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { private int[] array; private int[] original; private Random rand;
public Solution(int[] nums) { array = nums; original = nums.clone(); rand = new Random(); }
public int[] reset() { array = original; return original = original.clone(); }
public int[] shuffle() { int[] ans = array; for (int i = 0; i < ans.length; i++) { int selectedIdx = rand.nextInt(ans.length - i) + i; swap(ans, i, selectedIdx); } return ans; }
private void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
|
这个shuffle的思路着实没想到. 思路就是给每个位置挑元素, 被挑过的在之后的位置就不能再被选了. 比如第0个位置, 从所有的元素中挑一个, 然后和此时在第0个位置的元素swap一下, 从而让被挑`选到的元素放在第0个位置. 然后给第1个位置挑元素, 那么此时在第0个元素位置的元素就不能参与了, 我们要在1到array.length - 1这个范围再挑一个元素放到第1个位置. 大致就是这个思路.
时间复杂度: O(n) shuffle的时候要遍历每个位置.
空间复杂度: O(n) 我们用额外的数组存了一开始初始的时候给我们的数组.