leetcode 384打乱数组

刚开始看到这个题有点懵逼,因为格式有点复杂。后来发现这个题的问题在于如何将一个数组内的元素均匀的打乱,并且所有种类个数为n!个。所采用的洗牌算法为前n个数中随机挑选一个和第n个数交换,之后为前n-1个数中随机挑选一个数与第n-1个数交换,直至最后。贴代码

class Solution {
private:
vector<int> original;
public:
    Solution(vector<int>& nums) 
    {
        original = nums;
    }
    
    /** Resets the array to its original configuration and return it. */
    vector<int> reset() 
    {
        return original;
    }
    
    /** Returns a random shuffling of the array. */
    vector<int> shuffle() 
    {
        vector<int> nums(original);                    //用原数组来初始化新数组

        for (int i = nums.size() - 1; ~i; i -- )       //从后往前遍历
        {
            swap(nums[i], nums[rand() % (i + 1)]);     //rand()能随机生成0到最大随机数的任意整数
        }                                              //rand() % (i + 1)能随机生成0到i中的任意整数

        return nums;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(nums);
 * vector<int> param_1 = obj->reset();
 * vector<int> param_2 = obj->shuffle();
 */

 

posted @ 2021-03-26 12:05  zhaohhhh  阅读(47)  评论(0)    收藏  举报