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;
            }
        }
    }
}
相关推荐
2501_924889555 小时前
商超高峰客流统计误差↓75%!陌讯多模态融合算法在智慧零售的实战解析
大数据·人工智能·算法·计算机视觉·零售
jingfeng5146 小时前
C++模板进阶
java·c++·算法
地平线开发者6 小时前
征程 6X | 常用工具介绍
算法·自动驾驶
地平线开发者6 小时前
理想汽车智驾方案介绍 2|MindVLA 方案详解
算法·自动驾驶
艾莉丝努力练剑7 小时前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
地平线开发者7 小时前
LLM 中评价指标与训练概要介绍
算法·自动驾驶
小十一再加一7 小时前
【C初阶】自定义类型--结构体
c语言
Ghost-Face8 小时前
关于并查集
算法
flashlight_hi9 小时前
LeetCode 分类刷题:2529. 正整数和负整数的最大计数
python·算法·leetcode
花火|9 小时前
算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路
算法·图论