LeetCode刷题篇——下一个排列

下一个排列

题目

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
链接

思路

从右往左遍历数组,找到当前位比后一位小的第一个位置,记为left,若left为初始值,则说明数组完全降序,直接将数组整体反转;否则再从右往左遍历,找到比nums[left]大的第一个数,将它与nums[left]交换后,将left+1到末尾这一部分数组全部反转,即为下一个排列

class solution {
    
    
	public void nextPermutation(int[] nums) {
    
    
		int len = nums.length;
		int left = -1;
		// left为比后一位更小的数的索引
		for (int i = len - 2; i >= 0; i--) {
    
    
			if (nums[i] < nums[i + 1]) {
    
    
				left = i;
				break;
			}
		}

		if (left == -1) {
    
    
			reverse(nums, 0, len - 1);
		} else {
    
    
			int right = -1;
      		// right为从右往左比nums[left]大的第一个数的索引
			for (int j = len - 1; j > left; j--) {
    
    
				if (nums[j] > nums[left]) {
    
    
					right = j;
					break;
				}
			}
			int tmp = nums[left];
			nums[left] = nums[right];
			nums[right] = tmp;
			reverse(nums, left + 1, len - 1);
		}
	}

  	// 将数组在L~R范围内反转
	public void reverse(int[] nums, int L, int R) {
    
    
		while (L < R) {
    
    
			int tmp = nums[L];
			nums[L] = nums[R];
			nums[R] = tmp;
			L++;
			R--;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/wzc3614/article/details/129477079