首页 > 其他分享 >[数组排序] 0384. 打乱数组

[数组排序] 0384. 打乱数组

时间:2024-11-11 11:14:38浏览次数:3  
标签:0384 shuffle nums int 打乱 Solution 数组

文章目录

1. 题目大意

384. 打乱数组 - 力扣(LeetCode)



2. 题目大意

描述:给定一个整数数组 nums。

要求:设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是等可能的。

实现 Solution class:

  • Solution(int[] nums) 使用整数数组 nums 初始化对象。
  • int[] reset() 重设数组到它的初始状态并返回。
  • int[] shuffle() 返回数组随机打乱后的结果。

说明

  • 1≤nums.length≤50。
  • −106≤nums[i]≤106。
  • nums 中的所有元素都是 唯一的。
  • 最多可以调用 104 次 resetshuffle


3. 示例

输入:
["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]



4. 解题思路

思路 1:洗牌算法

题目要求在打乱顺序后,数组的所有排列应该是等可能的。对于长度为 n 的数组,我们可以把问题转换为:分别在 n 个位置上,选择填入某个数的概率是相同。具体选择方法如下:

  • 对于第 0 个位置,我们从 0∼n−1 总共 n 个数中随机选择一个数,将该数与第 0 个位置上的数进行交换。则每个数被选到的概率为 1n。
  • 对于第 1 个位置,我们从剩下 n−1 个数中随机选择一个数,将该数与第 1 个位置上的数进行交换。则每个数被选到的概率为 (第一次没选到并且第二次被选中)。
  • 对于第 2 个位置,我们从剩下 n−2 个数中随机选择一个数,将该数与第 2 个位置上的数进行交换。则每个数被选到的概率为 (第一次没选到、第二次没选到,并且第三次被选中)。
  • 依次类推,对于每个位置上,每个数被选中的概率都是 1n。


5. 参考代码

class Solution {

    int[] nums;
    int n;
    Random random = new Random();

    public Solution(int[] _nums) {
        nums = _nums;
        n = nums.length;
    }

    public int[] reset() {
        return nums;
    }

    public int[] shuffle() {
        int[] ans = nums.clone();
        for (int i = 0; i < n; i++) {
            swap(ans, i, i + random.nextInt(n - i));
        }
        return ans;
    }

    void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}


标签:0384,shuffle,nums,int,打乱,Solution,数组
From: https://blog.csdn.net/apple_74262176/article/details/143634367

相关文章

  • C小题目:有一个一维数组score,放10个学生的成绩,求平均成绩。
    #include<stdio.h>intaverage(intx[],intlen){inti,sum=0;for(i=0;i<len;i++){sum+=x[i];printf("%d\n",x[i]);};inta=sum/len;printf("theaverageis%d\n",a);};intmain(){......
  • 912. 排序数组
    题目链接本题使用的是快排解决。思路:「荷兰国旗」问题,具体思路跳转75.颜色分类代码classSolution{public:voidswap(vector<int>&nums,inti,intj){inttmp=nums[i];nums[i]=nums[j];nums[j]=tmp;}//[L,......
  • 关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算
    关于我,穿越异世界,凭c语言搅动风云vlog----利用数组进行大数相关计算一.有关大数你应该要知道的那些事1.大数的概念我们一般将计算机基本数据类型无法存储的数称之为大数,本文涉及的大数均为整数,不包含小数。而且下文代码实现中的数组大小可根据需要修改。2.问题引入在c......
  • 53. 最大子数组和
    题目链接解题思路最大子数组问题,有两个基本的想法,以i开头的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案;以i结尾的子数组结果是怎样的,求出所有的结果,最优的那个,就是答案。本题我们可以考虑,「以i结尾的结果是怎样的」,为啥?因为我们要求的是最大的累加和,我们求出了re......
  • 工作学习笔记(五)数组
    在Java中,数组有以下重要作用:存储数据可以将同类型的多个数据组合在一起。例如,存储一个班级学生的考试成绩。如果有50个学生,就可以创建一个 int 类型的数组 int[]scores=newint[50]; 来存放所有成绩。除了基本数据类型,也能存储对象。比如, String[]names=newStri......
  • 实验4 C语言数组应用编程
    实验任务1:task1.c源代码:1#include<stdio.h>2#defineN43#defineM245voidtest1(){6intx[N]={1,9,8,4};7inti;89printf("sizeof(x)=%d\n",sizeof(x));1011for(i=0;i<N;++i)......
  • 一道题把我气笑了:) 力扣.53 最大子数组和 leetcode maximum-subarray
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续系列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-IV力......
  • 实验4 c语言数组应用编程
    task1:1#include<stdio.h>2#include<stdlib.h>3#defineN44#defineM2567voidtest1(){8intx[N]={1,9,8,4};9inti;1011printf("sizeof(x)=%d\n",sizeof(x));1213for(i=0;i<N;++i)14......
  • 4-2-2.C# 数据容器 - HashSet 扩展(HashSet 集合操作、HashSet 存储对象的特性、HashSe
    HashSet概述HashSet<T>存储的元素是无序的HashSet<T>存储的元素是不可重复的HashSet<T>支持泛型,可以指定存储的元素的类型HashSet<T>不支持索引,不可以通过索引获取或修改元素HashSet<T>不是线程安全的,在多线程环境中需要谨慎使用一、HashSet集合操作1......
  • python中常见的8种数据结构之一数组的应用
    在Python中,数组是一种常见的数据结构,用于存储一系列相同类型的元素。在实际应用中,数组可以用于解决各种问题。以下是数组在Python中的一些常见应用:1.存储和访问数据:数组可以用于存储和访问一组数据。可以通过索引访问数组中的元素,也可以使用切片操作来获取数组的子集。2.......