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;
            }
        }
    }
}
相关推荐
董董灿是个攻城狮10 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
RuoZoe15 小时前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
AI软著研究员17 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish18 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱19 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx2 天前
CART决策树基本原理
算法·机器学习