首页 > 其他分享 >LeetCode 31_下一个排列

LeetCode 31_下一个排列

时间:2023-01-30 13:14:02浏览次数:51  
标签:arr 排列 nums int 31 一个 数组 LeetCode

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]

思路

①首先从后向前查找较小数,满足 a[i]<a[i+1],此时 [i+1,n)必然是下降序列。
②如果找到了顺序对,那么在区间 [i+1,n) 中从后向前查找第一个元素 j,使a[i]<a[j],这样「较大数」即为 a[j]。
③交换 a[i]与 a[j],此时可以证明区间 [i+1,n)必为降序,使其变为升序

代码

class Solution {
    public void nextPermutation(int[] nums) {
        int  l=0,r=nums.length-1;
        for(int i=nums.length-1;i>0;i--)
        {
            if(nums[i]>nums[i-1])
            {
                l=i-1;//注意是i-1
                break;
            }
        }
        for(int i=nums.length-1;i>l;i--)
        {
            if(nums[l]<nums[i])
            {
                r=i;
                break;
            }
        }
        int temp=nums[l];
        nums[l]=nums[r];
        nums[r]=temp;
        Arrays.sort(nums,l+1,nums.length);
        return;
    }
}

反思

学会找到规律
①1,4,2,3,从右->左,发现2<3, 则交换2,3,即1,4,3,2
②来个复杂的点的情况:1,3,4,2 从右->左,3 < 4,交换3,4肯定就可以了,即1,4,3,2,此时还差点什么?排序,我们需要对交换点的后面排序,最终得到1,4,2,3,
③再来一个更复杂的:1,4,3,2 还是从右->左,发现1 < 4,若交换后是4,1,3,2,肯定不对,此时应该找到比1大的数,因为1之后必为降序排列,所以找到比1的最小数,即2,交换后为2,1,4,3,再排序,得到2,1,3,4

标签:arr,排列,nums,int,31,一个,数组,LeetCode
From: https://www.cnblogs.com/Janecodehouse/p/17075148.html

相关文章

  • POJ--3169 Layout(最短路)
    记录12:362023-1-30http://poj.org/problem?id=3169reference:《挑战程序设计竞赛(第2版)》2.5.6p111DescriptionLikeeveryoneelse,cowsliketostandcloseto......
  • LeetCode | 35. 搜索插入位置
    ​ 题:力扣35.搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时......
  • 【双指针】LeetCode 18. 四数之和
    题目链接18.四数之和思路与【双指针】LeetCode15.三数之和思路相似,但是要注意测试用例可能溢出,需要转换为long代码classSolution{publicList<List<Inte......
  • LeetCode:1669. 合并两个链表
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListN......
  • 刷刷刷 Day 29 | 46. 全排列
    46.全排列LeetCode题目要求给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。示例输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2]......
  • 算法刷题 Day 27 | ● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串
    今日任务组合总和组合总和II分割回文串详细布置39.组合总和本题是集合里元素可以用无数次,那么和组合问题的差别其实仅在于startIndex上的控制题目链接/......
  • leetcode简单(矩阵):[566, 766, 832, 867, 999, 1030, 1261, 1275, 1337, 1351]
    目录566.重塑矩阵766.托普利茨矩阵832.翻转图像867.转置矩阵999.可以被一步捕获的棋子数1030.距离顺序排列矩阵单元格1260.二维网格迁移1275.找出井字棋的获胜者13......
  • LeetCode-21.合并两个有序链表
    21.合并两个有序链表(MergeTwoSortedLists)将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4......
  • 2315. 统计星号 ----- 模拟
    给你一个字符串 s ,每 两个 连续竖线 '|' 为一对 。换言之,第一个和第二个 '|' 为一对,第三个和第四个 '|' 为一对,以此类推。请你返回不在竖线对之间,s 中 '*......
  • LeetCode_周赛_330
    6337.统计桌面上的不同数字代码后面出现的数字都是小于n的。n=1时,答案是1。n>1时:第一天,n%(n-1)==1,n-1会被加入第二天,(n-1)%(n-2)==1,n-......