Skip to content

384. Shuffle an Array

Given an integer array nums, design an algorithm to randomly shuffle the array. All permutations of the array should be equally likely as a result of the shuffling.

Implement the Solution class:

  • Solution(int[] nums) Initializes the object with the integer array nums.
  • int[] reset() Resets the array to its original configuration and returns it.
  • int[] shuffle() Returns a random shuffling of the array.

Example 1:

Input
["Solution", "shuffle", "reset", "shuffle"]
[[[1, 2, 3]], [], [], []]
Output
[null, [3, 1, 2], [1, 2, 3], [1, 3, 2]]

Explanation
Solution solution = new Solution([1, 2, 3]);
solution.shuffle();    // Shuffle the array [1,2,3] and return its result.
                       // Any permutation of [1,2,3] must be equally likely to be returned.
                       // Example: return [3, 1, 2]
solution.reset();      // Resets the array back to its original configuration [1,2,3]. Return [1, 2, 3]
solution.shuffle();    // Returns the random shuffling of array [1,2,3]. Example: return [1, 3, 2]

Constraints:

  • 1 <= nums.length <= 50
  • -106 <= nums[i] <= 106
  • All the elements of nums are unique.
  • At most 104 calls in total will be made to reset and shuffle.

Solution:

class Solution {
    int[] or;

    private Random random;

    public Solution(int[] nums) {
        or = new int[nums.length];
        for (int i = 0; i < nums.length; i++){
            or[i] = nums[i];
        }

        random = new Random();





    }

    public int[] reset() {
        return or;
    }

    public int[] shuffle() {
        int[] result = or.clone();
        for (int i = result.length - 1; i > 0; i--){
            int j = random.nextInt(i + 1);
            swap(result, i, j);
        }

        return result;

    }

    private void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution obj = new Solution(nums);
 * int[] param_1 = obj.reset();
 * int[] param_2 = obj.shuffle();
 */

P.S.: You cannot write the code like in the following, because all permuations of the array should be equally likely as a result of the shuffling.

    public int[] shuffle() {
        int[] numsClone = n.clone();

        int i = random.nextInt(numsClone.length);
        int j = random.nextInt(numsClone.length);
        while(i == j){
            j = random.nextInt(numsClone.length);
        }

        swap(numsClone, i, j);


        // for (int i = 0; i < numsClone.length; i++){
        //     int j = random.nextInt(i + 1); // 0, i
        //     swap(numsClone, i, j);
        // }

        return numsClone;
    }