算法总结 - 数组 - 排列组合

本文探讨数组类型的排列组合问题,重点讲解如何实现下一个排列。通过示例解释如何找到原数组的下一个更大排列,并保证在原地修改且仅使用常数额外空间。在没有更大排列的情况下,返回升序排列。
摘要由CSDN通过智能技术生成

Array

排列组合

排列组合是数组类型题目中的常考题。


31. Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).The replacement must be in-place and use only constant extra memory.Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

题目大意
给一个数组,把它看成用数组表示的数字。 要求重新排列这个数字,找出比下一个比原数字大的数字排列,例如原数组是[1, 3, 2], 下一个比它大的数组排列应该是[2, 3, 1]而不是[3, 1, 2]。要求使用常数空间,如果没有比原数组更大的排列,那么就返回升序排列的数组。

解题思路

  1. 从最高位到最低位开始找,直到找到当前数字比它低位的数字小的数。
  2. 从最低位到最高位开始找,直到找到当前数字比上一步找到数字大的数。
  3. 交换这两个数,逆序第一个数所在位置之后的数组。
  4. 如果找不到第一个数,那么证明数组已经是最大值了,直接逆序整个数组就行。

复杂度
TC: O(n) SC: O(1)

public void nextPermutation(int[] nums) {
   
        if (nums == null || nums.length <= 1) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值