384. 打乱数组(中等)
思路
- 题目要求 shuffle 函数随机随机生成数组,采用经典的Fisher-Yates 洗牌算法,原理是「随机交换位置来实现随机打乱」,有正向遍历和反向遍历两种算法,这里使用反向遍历。
易错点
- 我一直不太会写设计一个类的题,这题需要构造函数,可以有很多种写法:
Solution(vector<int>& nums) : origin(std::move(nums)){}
;- 或者
Solution(vector<int>& nums) { origin=nums;//:origin=std::move(nums)也可以}
代码
class Solution {
vector<int> origin;
public:
Solution(vector<int>& nums) : origin(std::move(nums)){}
vector<int> reset() {
return origin;
}
vector<int> shuffle() {
if(origin.empty()) return {};
vector<int> shuffled(origin);
int n = origin.size();
// fisher_Yates 洗牌
for(int i=n-1; i>=0; --i){
swap(shuffled[i], shuffled[rand() % (n)]);
}
return shuffled;
}
};
/**
* 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();
*/