【每日一题】31. Next Permutation

题目描述

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place and use only constant extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,3` → `1,3,2`
`3,2,1` → `1,2,3`
`1,1,5` → `1,5,1

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

题解

首先想到的是,按顺序生成当前数组所有可能的排列组合,然后根据当前排列组合在其中的位置,如果是最后一个,返回第一个;否则,返回所在位置的下一个排列。为了保证不同排列符合题目的顺序,在生成所有组合之前,先进行升序排序,然后再进行排列。–但是这种情况,时间复杂度太高,而且不满足题目要求的空间复杂度要求

所以想到,根据上述的排列过程找出规律,根据给出的排列情况,直接生成下一个排列。

比如,对于数组1,2,3,4,5,下一个排列应该是1,2,3,5,4,下一个应该是1,2,4,3,5.变动的情况先发生在末尾,在以1,2,3,4之后只有一个5,下一个排列,应该保持1,2,3不动,整体变成1,2,3,5,4;

  1. 从后往前,先找到第一个不是降序排序的数字的下标;
  2. 如果下标<0,说明这个排列应该是最后一个,返回全序列的升序排序结果;
  3. 如果不为0,在这个元素之后找到第一个比它大的数字的下标,两者交换,对后续子数组做升序排序即可。

代码:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        # 1,2,4,3,0
        if (nums.empty()) return;
        int size = nums.size(), i = size - 2, j = size - 1;
        
        while (i>=0 && nums[i] >= nums[i+1]) i--;
        
        if (i >= 0){
            while (nums[j] <= nums[i]) j--;
            swap(nums[i], nums[j]);
        }
        reverse(nums.begin()+i+1, nums.end());
    }
};

感觉说的不够清晰~

Reference

https://www.cnblogs.com/grandyang/p/4428207.html

向大佬学习


欢迎关注公众号,一起学习

### 回答1: np.random.permutation 是 numpy 库中的一个函数,可以对数组进行随机排列(打乱顺序)。它可以接受一个整数参数,表示对该长度的数组进行排列;或者接受一个数组参数,对该数组进行排列。 示例: ``` python import numpy as np # shuffle an array of length 10 arr = np.random.permutation(10) # shuffle elements of an existing array np.random.shuffle(arr) ``` 返回排列后的新数组,原数组不变。 ### 回答2: np.random.permutation是NumPy库中的一个函数,用于生成一个随机排列的序列。它的作用是将给定的序列进行随机排列,返回一个新的随机序列。 在使用np.random.permutation函数时,我们可以将一个整数n作为参数传入,返回一个从0到n-1的随机排列的一维数组。这个数组包含了0到n-1的所有整数,且这些整数的排列顺序是随机的。 另外,np.random.permutation还可以接受一个数组作为输入参数。对于一个长度为n的数组,np.random.permutation会返回一个随机排列的新数组,这个新数组的元素是原数组中的元素,只是排列顺序被打乱了。 使用np.random.permutation函数可以用于数据集的随机洗牌,这在机器学习中很常见。通过将数据集进行随机洗牌,可以打破原来数据的顺序,减少数据的相关性,提高模型的泛化能力。 综上所述,np.random.permutation是NumPy库中的一个函数,用于生成一个随机排列的序列。它可以接受一个整数n或一个数组作为输入参数,返回一个随机排列的新数组。这个函数可以应用于数据的随机洗牌等场景。 ### 回答3: np.random.permutation是NumPy库中的一个函数,用于对数组进行随机重排。它能够返回一个已经随机排列之后的数组。 该函数的参数可以是一个整数n,也可以是一个数组或者类数组对象。如果是一个整数n,那么会返回一个从0到n-1的随机排列的数组。如果是一个数组或者类数组对象,那么返回的将是该数组的随机排列。 使用np.random.permutation的示例如下: ```python import numpy as np # 对整数进行随机排列 arr1 = np.random.permutation(5) print(arr1) # 输出:[3 2 1 0 4] # 对数组进行随机排列 arr2 = np.array([1, 2, 3, 4, 5]) arr3 = np.random.permutation(arr2) print(arr3) # 输出:[3 2 1 5 4] ``` 通过调用np.random.permutation函数,我们可以得到一个随机排列的数组,这在很多需要随机顺序的应用中非常有用,比如数据的洗牌、创建随机样本等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值