原题链接在这里:https://leetcode.com/problems/next-permutation/
参考了这篇博文:http://blog.csdn.net/linhuanmars/article/details/20434115
分两种情况:
1. 从前往后一路数值一直变小,如"654321", 返回的应该是"123456"也就是整个反转
2. 数值没有一直变下,如"236541", 此时从后往前找到第一个数值下降的点3<6, 找到3,记下index i,
然后从3往后开始找第一个比3 小的数, 1<3, 找到1, 记下1前一个点的index j. swap nums[i] and nums[j]. 变成"246531"
最后反转 i 后面的部分, 得到"241356".
Note: 找i的时候是 nums[i] >= nums[i+1] 等于时也往前移动i, 只有小于时才停下。
AC Java:
public class Solution { public void nextPermutation(int[] nums) { //以2,3,6,5,4,1为例 //从后往前,找到第一个变小的的数字,如3 //从3的下一位开始向后找到第一个比3小的数字的前一个数,1比3小,1前面的数是4 //调换3 和 4,然后反转 调换后 4后面的数字 if(nums == null || nums.length == 0){ return; } int i = nums.length - 2; while(i>=0 && nums[i]>=nums[i+1]){ i--; } if(i>=0){ int j = i+1; while(j<nums.length && nums[j]>nums[i]){ j++; } j--; swap(nums, i,j); } reverse(nums,i+1,nums.length-1); } private void swap(int [] nums, int i, int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } private void reverse(int [] nums, int i, int j){ while(i<j){ swap(nums,i++,j--); } } }
时间: 2024-11-09 16:24:38