leetcode 下一个排列

示例:73642 的下一个排列是74236

  • 从右往左遍历,比较相邻两个数据 右侧数据是否比左侧大,找到:"36": 6比3大
  • 继续从该节点“3”的右侧数据中 找出比3大 最小的那个数据,找到4
  • 3和4交换位置;74632
  • 对交换后4右侧的数据进行排序:74236
class Solution {

    /**
     * @param Integer[] $nums
     * @return NULL
     */
    function nextPermutation (&$nums)
    {

        if (sizeof($nums) < 2) {
            return $nums;
        }


        $i = sizeof($nums) - 1;
        while ($i > 0) {
            // 从右到左 如果相邻数据 右边的值比左边的大
            if ($nums[$i] > $nums[$i - 1]) {
                $j = sizeof($nums) - 1;
                // 遍历该节点右侧的数据
                while ($j > $i - 1) {
                    // 找到这其中比该节点大的数据 进行交换
                    if ($nums[$j] > $nums[$i - 1]) {
                        $p            = $nums[$j];
                        $nums[$j]     = $nums[$i - 1];
                        $nums[$i - 1] = $p;
                        // 然后对该节点右侧的数据从小到大排序
                        for ($m = $i; $m <= sizeof($nums) - 1; $m++) {
                            for ($n = $m + 1; $n <= sizeof($nums) - 1; $n++) {
                                if ($nums[$n] < $nums[$m]) {
                                    $q        = $nums[$m];
                                    $nums[$m] = $nums[$n];
                                    $nums[$n] = $q;
                                }
                            }
                        }
                        return $nums;
                    }
                    $j--;
                }
            }
            $i--;
        }
        // 如果数据是倒序数组,则直接反转
        for ($k = 0; $k < (sizeof($nums) - 1) / 2; $k++) {
            $l                            = $nums[$k];
            $nums[$k]                     = $nums[sizeof($nums) - 1 - $k];
            $nums[sizeof($nums) - 1 - $k] = $l;

        }
        return $nums;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值