打乱数组
给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。
实现 Solution class:
Solution(int[] nums) 使用整数数组 nums 初始化对象
int[] reset() 重设数组到它的初始状态并返回
int[] shuffle() 返回数组随机打乱后的结果
示例:
输入
["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]
提示:
1 <= nums.length <= 200
-106 <= nums[i] <= 106
nums 中的所有元素都是 唯一的
最多可以调用 5 * 104 次 reset 和 shuffle
思路:使用两个全局变量,一个存初始数组,一个存乱序的数组。至于乱序数组的生成,我们直接使用Random随机产生下标,进行交换即可。
代码:
private int[] resetNums;
private int[] nums;
public Solution(int[] nums) {
this.nums = nums;
this.resetNums = nums.clone();
}
/** Resets the array to its original configuration and return it. */
public int[] reset() {
this.nums = this.resetNums.clone();
return this.nums;
}
/** Returns a random shuffling of the array. */
public int[] shuffle() {
Random random = new Random();
for(int i=0;i<this.nums.length;i++){
int dom = random.nextInt(this.nums.length);
if(i!=dom){
int temp=this.nums[i];
this.nums[i]=this.nums[dom];
this.nums[dom]=temp;
}
}
return this.nums;
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shuffle-an-array
被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
示例 1:
输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:
输入:board = [["X"]]
输出:[["X"]]
提示:
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j] 为 'X' 或 'O'
思路:可以观看例题,我们可以发现,只有在边界的’O’不会被围绕,所以我们直接从边界的’O’下手,将所有与边界’O’线连接的’O’数据修改为A,之后遍历将A改回’O’,将幸存的’O’改为’X’即可。
代码:
public void solve(char[][] board) {
int m = board.length;
int n = board[0].length;
for (int i = 0; i < m; i++) {
// 遍历竖的O
if(board[i][0]=='O'){
modify(board,i,0);
}
if(board[i][n-1]=='O') {
modify(board, i, n - 1);
}
}
for (int i = 0; i < n; i++) {
// 遍历横的O
if(board[0][i]=='O'){
modify(board,0,i);
}
if(board[m-1][i]=='O') {
modify(board, m-1, i);
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (board[i][j] == 'A') {
board[i][j] = 'O';
} else if (board[i][j] == 'O') {
board[i][j] = 'X';
}
}
}
}
public void modify(char[][] board,int x,int y){
if (x < 0 || x >= board.length || y < 0 || y >= board[0].length || board[x][y] != 'O') {
return;
}
board[x][y] = 'A';
modify(board, x + 1, y);
modify(board, x - 1, y);
modify(board, x, y + 1);
modify(board, x, y - 1);
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions