题意:
解题思路:
思路: 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 index:1 1 2 7 4 3 1 //右到左第一个逆序的数字 是 2 1 2 7 4 3 1 //右到左第一个比逆序的数字大的数字 是 3 1 3 7 4 2 1 // 2 和 3 交换 1 3 7 4 2 1 //index之后的数字翻转 index 1 3 1 2 4 7
PHP代码实现:
class Solution { function nextPermutation(&$nums) { $n = count($nums); for ($i = $n - 1; $i >= 0; $i--) { if ($nums[$i + 1] > $nums[$i]) { for ($j = $n - 1; $j >= 0; $j--) { if ($nums[$j] > $nums[$i]) { break; } } $temp = $nums[$i]; $nums[$i] = $nums[$j]; $nums[$j] = $temp; $left = $i + 1; $right = $n - 1; return $this->reverse($nums, $left, $right); } } return $this->reverse($nums, 0, $n - 1); } function reverse(&$nums, $left, $right) { while ($left < $right) { $temp = $nums[$left]; $nums[$left] = $nums[$right]; $nums[$right] = $temp; $left ++; $right --; } } function swap(&$nums, $i, $j) { $tmp = $nums[$i]; $nums[$i] = $nums[$j]; $nums[$j] = $tmp; } function nextPermutation1(&$nums) { if ($nums == null || count($nums) < 2) return; $n = count($nums); $p = $n - 2; while ($p >= 0 && $nums[$p] >= $nums[$p+1]) --$p; if ($p >= 0) { $i = $n - 1; while ($i > $p && $nums[$i] <= $nums[$p]) --$i; $this->swap($nums, $i, $p); } for ($i = $p+1, $j = $n-1; $i < $j; ++$i,--$j) $this->swap($nums, $i, $j); }}
GO代码实现:
func nextPermutation(nums []int) { n := len(nums) i, j := n-2, n-1 // 从右往左找到第一个非递增的数 for ; i >= 0; i-- { if nums[i+1] > nums[i] { break } } if i < 0 { reverse(nums) return } // 从右往走找到第一个比nums[i]大的数 for ; j >= 0; j-- { if nums[j] > nums[i] { break } } nums[j], nums[i] = nums[i], nums[j] // 将非递增位置之后的反转成为从右往走递减序列 reverse(nums[i+1:n]) }func reverse(nums []int) { l, r := 0, len(nums)-1 for l <= r { nums[l], nums[r] = nums[r], nums[l] l, r = l+1, r-1 }}