LeetCode 31. 下一个排列


/**
1,2,3,4
1,2,4,3
1,3,2,4
1,3,4,2
1,4,2,3
1,4,3,2
2,1,3,4
2,1,4,3
2,3,1,4
2,3,4,1
...
4,3,2,1

从以上得到规律

解题思路
1. 从后往前找到第一个相邻升序的位置 i, i+1
2. 从后往前找到第一个比a[i]的大的数 k
3. 交换a[i] a[k]
4. 然后将i+1之后的位置,reverse
*/
func nextPermutation(nums []int)  {
	i, j, k := len(nums)-2, len(nums) - 1, len(nums) - 1
    //从后往前找到第一个a[i] < a[j]的位置
	for ;i>=0 && nums[i] >= nums[j]; {
		i--
		j--
	}
    
	if i >= 0 {
        //从后往前找到第一个比a[i]大的数
		for ;k>=0 && nums[k] <= nums[i]; {
			k--
		}
        // 交换a[i] a[k]
		nums[i], nums[k] = nums[k], nums[i]
	}

    // 然后将i+1之后的位置,reverse
	for i, j := j, len(nums)-1; i<j; {
		nums[i], nums[j] = nums[j], nums[i]
		i++
		j--
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值