Shuffle an Array

medium array randomized fisher–yates

Problem

Implement reset() and shuffle() for an integer array, where shuffle() returns a uniformly random permutation of the original array.

Inputnums = [1, 2, 3, 4, 5]
Outputany of 5! = 120 permutations with equal probability
Fisher–Yates: for i from 0 to n−1, swap a[i] with a[j] for j uniformly in [i, n−1].

import random

class Solution:
    def __init__(self, nums):
        self.original = nums[:]
        self.arr = nums[:]
    def reset(self):
        self.arr = self.original[:]
        return self.arr
    def shuffle(self):
        for i in range(len(self.arr)):
            j = random.randint(i, len(self.arr) - 1)
            self.arr[i], self.arr[j] = self.arr[j], self.arr[i]
        return self.arr
class Solution {
  constructor(nums) {
    this.original = nums.slice();
    this.arr = nums.slice();
  }
  reset() { this.arr = this.original.slice(); return this.arr; }
  shuffle() {
    const a = this.arr;
    for (let i = 0; i < a.length; i++) {
      const j = i + Math.floor(Math.random() * (a.length - i));
      [a[i], a[j]] = [a[j], a[i]];
    }
    return a;
  }
}
class Solution {
    private int[] original;
    private int[] arr;
    private Random rng = new Random();
    public Solution(int[] nums) {
        original = nums.clone();
        arr = nums.clone();
    }
    public int[] reset() { arr = original.clone(); return arr; }
    public int[] shuffle() {
        for (int i = 0; i < arr.length; i++) {
            int j = i + rng.nextInt(arr.length - i);
            int t = arr[i]; arr[i] = arr[j]; arr[j] = t;
        }
        return arr;
    }
}
class Solution {
    vector<int> original, arr;
public:
    Solution(vector<int>& nums) : original(nums), arr(nums) {}
    vector<int> reset() { arr = original; return arr; }
    vector<int> shuffle() {
        for (int i = 0; i < (int)arr.size(); i++) {
            int j = i + rand() % (arr.size() - i);
            swap(arr[i], arr[j]);
        }
        return arr;
    }
};
Time: O(n) Space: O(n) for the saved original