力扣题目
解题思路
java代码
力扣题目:
给你一个整数数组 nums
,设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是 等可能 的。
实现 Solution
class:
Solution(int[] nums)
使用整数数组nums
初始化对象int[] reset()
重设数组到它的初始状态并返回int[] shuffle()
返回数组随机打乱后的结果
示例 1:
输入 ["Solution", "shuffle", "reset", "shuffle"] [[[1, 2, 3]], [], [], []] 输出 [null, [3, 1, 2], [1, 2, 3], [1, 3, 2]] 解释 Solution solution = new Solution([1, 2, 3]); solution.shuffle(); // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如,返回 [3, 1, 2] solution.reset(); // 重设数组到它的初始状态 [1, 2, 3] 。返回 [1, 2, 3] solution.shuffle(); // 随机返回数组 [1, 2, 3] 打乱后的结果。例如,返回 [1, 3, 2]
解题思路:
算法原理:
这道题实现了一个对给定数组进行重置和随机打乱操作的类。
思路:
- 在
Solution
方法中,保存原始数组的副本,以便后续进行重置操作。 reset
方法通过复制原始数组的副本到当前数组,实现重置功能。shuffle
方法使用随机数生成器,通过不断交换数组中的元素来实现打乱数组的效果。
代码分析:
Solution
方法中,使用System.arraycopy
方法复制数组,保证了原始数组的准确备份。shuffle
方法中,通过随机生成索引,并交换对应位置的元素,实现了打乱数组的目的。
时间复杂度:
reset
方法的时间复杂度为 ,其中n
是数组的长度,因为需要复制n
个元素。shuffle
方法的时间复杂度也为 ,因为需要遍历数组进行元素交换操作。
空间复杂度:
Solution
方法中创建了一个与输入数组长度相同的新数组来存储原始数组的副本,空间复杂度为 。reset
和shuffle
方法的空间复杂度为 ,只使用了固定的几个变量,没有额外的空间分配。
java代码:
package com.example.myapplication;
import java.util.Random;
public class Leetcode384 {
int[] nums;
int[] original;
public void Solution(int[] nums) {
this.nums = nums;
this.original = new int[nums.length];
System.arraycopy(nums, 0, original, 0, nums.length);
}
public int[] reset() {
System.arraycopy(original, 0, nums, 0, nums.length);
return nums;
}
public int[] shuffle() {
Random random = new Random();
for (int i = 0; i < nums.length; ++i) {
int j = i + random.nextInt(nums.length - i);
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
return nums;
}
public static void main(String[] args) {
int[] newInt = new int[]{1, 2, 3};
Leetcode384 leetcode384 = new Leetcode384();
leetcode384.Solution(newInt);
leetcode384.shuffle();
leetcode384.reset();
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项