LeetCode 31题:下一个排列

目录

题目

思路

代码


题目

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1]

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2]
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]
  • arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

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

示例 1:

复制代码
输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

复制代码
输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:

复制代码
输入:nums = [1,1,5]
输出:[1,5,1]

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100

思路

一串数字排列的下一个排序找法是:从末尾开始找第一次出现nums[ i ] >nums[ i-1 ] 的位置,在 i -1之前的数字排序不变,在 i -1之后寻找大于nums[ i-1 ]的最小值,找到后与nums[ i-1 ]交换。交换后,i - 1之后的数字按非递减排序即可。


代码

cs 复制代码
#include<stdio.h>
#include<stdlib.h>

void nextPermutation(int* nums, int numsSize);

int main()
{
    int nums[3]={1};
    int size=1;
    nextPermutation(nums,size);
    for(int i=0;i<size;i++)
    {
        printf("%d ",nums[i]);
    }
    return 0;
}

void nextPermutation(int* nums, int numsSize)
{
    int sign=0;
    int i;
    for(i=numsSize-1;i>0&&nums[i]<=nums[i-1];i--);
    if(numsSize==1)
    return ;
    if(i==0&&nums[i+1]<=nums[i])
    {
        int left=0,right=numsSize-1;
        while(left<right)
        {
            int x=nums[left];
            nums[left]=nums[right];
            nums[right]=x;
            left++;
            right--;
        }
    }
    else
    {
        int target=i;
        int min=nums[i];
        for(int j=i+1;j<numsSize;j++)
        {
            if(nums[j]>nums[i-1]&&nums[j]<min)
            {
                min=nums[j];
                target=j;
            }
        }
        int a=nums[target];
        nums[target]=nums[i-1];
        nums[i-1]=a;
        int len=numsSize-i;
        for(int p=len/2;p>=1;p=p/2)
        {
            for(int q=i+p;q<numsSize;q++)
            {
                int temp=nums[q];
                int j;
                for(j=q-p;j>=i&&nums[j]>temp;j=j-p)
                {
                    nums[j+p]=nums[j];
                }
                nums[j]=temp;
            }
        }
    }
}
相关推荐
智者知已应修善业20 小时前
【51单片机按键控制流水灯+数码管显示按键次数】2023-6-15
c++·经验分享·笔记·算法·51单片机
汉克老师20 小时前
GESP2023年12月认证C++三级( 第三部分编程题(1、小猫分鱼))
c++·算法·模拟算法·枚举算法·gesp三级·gesp3级
不知名的老吴20 小时前
View的三大特性之一:迟绑定
开发语言·c++·算法
小雅痞20 小时前
[Java][Leetcode hard] 135. 分发糖果
java·算法·leetcode
Legendary_00820 小时前
LDR6500U PD取电芯片:赋能设备Type-C升级,解锁高效安全取电新体验
c语言·开发语言·安全
黎阳之光20 小时前
黎阳之光:全域实景立体管控,重构智慧电厂与变电站数字孪生新范式
大数据·人工智能·算法·安全·数字孪生
嘻嘻哈哈樱桃20 小时前
数据流中的中位数 力扣--160
算法·leetcode·职场和发展
老约家的可汗20 小时前
深入浅出:Map与Set的核心原理与使用场景
数据结构·算法
j_xxx404_20 小时前
力扣算法题:字符串(最长公共前缀|最长回文子串)
c++·算法·leetcode
承渊政道20 小时前
【递归、搜索与回溯算法】(穷举vs暴搜vs深搜vs回溯vs剪枝:一文讲清概念与用法)
数据结构·c++·算法·决策树·深度优先·剪枝·宽度优先