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;
            }
        }
    }
}
相关推荐
CodeByV3 分钟前
【双指针】复写零
数据结构·算法
程序员小范3 分钟前
8年NLP算法工程师郭志才:Ai正在模糊内容的产权边界。
人工智能·算法·自然语言处理
练习时长一年3 分钟前
LeetCode热题(路径总和 III)
数据结构·算法
野蛮人6号4 分钟前
力扣热题100道前84道,内容和力扣官方稍有不同,记录了本人的一些独特的解法
java·算法·leetcode·职场和发展
v***44676 分钟前
【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展
算法·架构
roman_日积跬步-终至千里6 分钟前
【模式识别与机器学习(6)】主要算法与技术(下篇:高级模型与集成方法)之进化计算(Evolutionary Computation)
人工智能·算法·机器学习
玖剹7 分钟前
floodfill算法题目(二)
c语言·c++·算法·leetcode·深度优先·dfs·深度优先遍历
surtr17 分钟前
区间查询mex异或gcd (焰与霜的共鸣,可持久化线段树+思维)
数据结构·c++·算法·数学建模·stl·动态规划
自然常数e10 分钟前
深入理解指针(3)
c语言·visual studio
伯远医学16 分钟前
CUT&RUN
java·服务器·网络·人工智能·python·算法·eclipse