leetcode: Next Permutation
2014-03-15 00:45
253 查看
理解9587643这个串的下一个是什么就行。
首先,从后往前找到num[i]<num[i+1]的第一个数,是5
然后从后往前找到第一个比5大的数,是6.
然后5和6换位置,得到9687543,
然后把6后面的数颠倒,9634578即可。
public class Solution {
public void nextPermutation(int[] num) {
int i,p1=-1,p2=-1,tmp;
int n=num.length;
if(n==0 || n==1)
return;
for(i=n-2;i>=0;i--)
{
if(num[i]<num[i+1])
{
p1=i;
break;
}
}
if(i==-1)
{
Arrays.sort(num);
return;
}
for(i=n-1;i>=0;i--)
{
if(num[i]>num[p1])
{
p2=i;
break;
}
}
tmp=num[p2];
num[p2]=num[p1];
num[p1]=tmp;
for(i=0;i<(n-1-p1)/2;i++)
{
tmp=num[p1+1+i];
num[p1+1+i]=num[n-1-i];
num[n-1-i]=tmp;
}
}
}
首先,从后往前找到num[i]<num[i+1]的第一个数,是5
然后从后往前找到第一个比5大的数,是6.
然后5和6换位置,得到9687543,
然后把6后面的数颠倒,9634578即可。
public class Solution {
public void nextPermutation(int[] num) {
int i,p1=-1,p2=-1,tmp;
int n=num.length;
if(n==0 || n==1)
return;
for(i=n-2;i>=0;i--)
{
if(num[i]<num[i+1])
{
p1=i;
break;
}
}
if(i==-1)
{
Arrays.sort(num);
return;
}
for(i=n-1;i>=0;i--)
{
if(num[i]>num[p1])
{
p2=i;
break;
}
}
tmp=num[p2];
num[p2]=num[p1];
num[p1]=tmp;
for(i=0;i<(n-1-p1)/2;i++)
{
tmp=num[p1+1+i];
num[p1+1+i]=num[n-1-i];
num[n-1-i]=tmp;
}
}
}
相关文章推荐
- Palindrome Number
- Max Points on a Line
- Evaluate Reverse Polish Notation
- Sort List
- Insertion Sort List
- LRU Cache
- Binary Tree Postorder Traversal
- Binary Tree Preorder Traversal
- Reorder List
- Linked List Cycle
- Linked List Cycle II
- Word Break
- Word Break II
- Copy List with Random Pointer
- Single Number
- Single Number II
- Candy
- Gas Station
- Clone Graph
- Palindrome Partitioning