leetcode题解-31. Next Permutation
2017-10-23 20:36
357 查看
题目:对于给定的一个全排列,求解其“下一个”全排列。对于不了解全排列是什么的同学,可以点击此处进行查看全排列-百度百科。
例子:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
题解:这道题让我们求下一个排列顺序,可以分为两种情况。第一种,类似于[6,5,4,3,2,1]这种,这是全排列中最后一个排列,那么直接将数组逆序,返回[1,2,3,4,5,6]即可。第二种,我们再来看下面一个例子,有如下的一个数组
[4, 3, 7, 6, 5, 2, 1]
下一个排列为:
[4, 5, 1, 2, 3, 6, 7]
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了3时才减小的,然后我们再从后往前找第一个比3大的数字,是5,那么我们交换3和5,再把此时5后面的所有数字转置一下即可,步骤如下:
[4, 3, 7, 6, 5, 2, 1]
[4, 3, 7, 6, 5, 2, 1]
[4, 5, 7, 6, 3, 2, 1]
[4, 5, 1, 2, 3, 6, 7]
那么代码为:
例子:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
题解:这道题让我们求下一个排列顺序,可以分为两种情况。第一种,类似于[6,5,4,3,2,1]这种,这是全排列中最后一个排列,那么直接将数组逆序,返回[1,2,3,4,5,6]即可。第二种,我们再来看下面一个例子,有如下的一个数组
[4, 3, 7, 6, 5, 2, 1]
下一个排列为:
[4, 5, 1, 2, 3, 6, 7]
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了3时才减小的,然后我们再从后往前找第一个比3大的数字,是5,那么我们交换3和5,再把此时5后面的所有数字转置一下即可,步骤如下:
[4, 3, 7, 6, 5, 2, 1]
[4, 3, 7, 6, 5, 2, 1]
[4, 5, 7, 6, 3, 2, 1]
[4, 5, 1, 2, 3, 6, 7]
那么代码为:
import java.util.Arrays; class Solution { public static void nextPermutation(int[] nums) { int len = nums.length; if(len == 0 || len == 1) return; int i,j; // 寻找i值 for(i = len - 1; i > 0; i--){ if(nums[i - 1] < nums[i]){ break; } } if(i == 0){ // 如果为全排列最后一个排列 reverse(nums, 0, len - 1); }else{ // 如果不是最后一个排列 i--; // 从右侧查找第一个比Num[i]大的数值 for(j = len - 1; j > i; j--){ if(nums[i] < nums[j]){ break; } } // 交换nums[i] nums[j] swap(nums, i, j); // 逆序 reverse(nums, i + 1, len - 1); } } public static void reverse(int[] nums, int start, int end){ while(start < end){ int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } public static void swap(int nums[], int start, int end){ int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; } public static void main(String[] args) { int[] nums = {4,3,7,6,5,2,1}; nextPermutation(nums); System.out.println(Arrays.toString(nums)); } }
相关文章推荐
- Leetcode题解(31)
- Leetcode题解-31. Next Permutation
- leetcode题解-31. Next Permutation
- leetcode 题解代码整理 31-35题
- LeetCode题解:4. Median of Two Sorted Arrays
- leetcode 27 题解 翻译 Python版
- leetcode题解-4. Median of Two Sorted Arrays
- LeetCode题解:Binary Tree Paths
- LeetCode题解——8 String to Integer (atoi)
- Leetcode题解-6. ZigZag Conversion
- LeetCode题解——Different Ways to Add Parentheses
- leetcode题解日练--2016.8.30
- LeetCode题解——Roman to Integer
- leetcode题解-349.Intersection of Two Arrays && 350. Intersection of Two Arrays II
- leetcode344题 题解 翻译 C语言版 Python版
- leetcode100题 题解 翻译 C语言版 Python版
- Leetcode题解 102. Binary Tree Level Order Traversal
- leetcode 题解 翻译 C语言 Python 合集 (不断更新)
- LeetCode题解:Clone Graph
- [LeetCode]31. Next Permutation