leetcode刷题系列C++-next permutation
2016-02-19 18:00
381 查看
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
Subscribe to see which companies asked this question
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int pos = -1;
int length = nums.size();
//找到第一个升序的位置
for (int i = length - 1; i > 0; --i)
{
if(nums[i] > nums[ i - 1])
{
pos = i - 1;
break;
}
}
//如果没有找到 也就是一直都是升序的 pos为负值 那么直接反序即可
if(pos < 0)
{
reverse(nums,0,length - 1);
return;
}
//找到了破坏升序的那个数据 将该元素跟第一个比他大的元素交换
for(int i = length - 1; i > pos; --i)
{
if(nums[i] > nums[pos])
{
int tmp = nums[i];
nums[i] = nums[pos];
nums[pos] = tmp;
break;
}
}
reverse(nums,pos + 1, length - 1);
}
void reverse(vector<int>& nums, int begin,int end)
{
int tmp = 0;
while(begin < end)
{
tmp = nums[begin];
nums[begin] = nums[end];
nums[end] = tmp;
begin++;
end--;
}
}
};
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3→
1,3,2
3,2,1→
1,2,3
1,1,5→
1,5,1
Subscribe to see which companies asked this question
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int pos = -1;
int length = nums.size();
//找到第一个升序的位置
for (int i = length - 1; i > 0; --i)
{
if(nums[i] > nums[ i - 1])
{
pos = i - 1;
break;
}
}
//如果没有找到 也就是一直都是升序的 pos为负值 那么直接反序即可
if(pos < 0)
{
reverse(nums,0,length - 1);
return;
}
//找到了破坏升序的那个数据 将该元素跟第一个比他大的元素交换
for(int i = length - 1; i > pos; --i)
{
if(nums[i] > nums[pos])
{
int tmp = nums[i];
nums[i] = nums[pos];
nums[pos] = tmp;
break;
}
}
reverse(nums,pos + 1, length - 1);
}
void reverse(vector<int>& nums, int begin,int end)
{
int tmp = 0;
while(begin < end)
{
tmp = nums[begin];
nums[begin] = nums[end];
nums[end] = tmp;
begin++;
end--;
}
}
};
相关文章推荐
- c++ 设计模式5 (Observer / Event 观察者模式)
- (WIP)C语言知识回顾(by quqi99)
- C语言 百炼成钢17
- C++函数的默认参数
- C语言
- c++ 一个头文件引用另一个头文件的类
- c++ 堆栈解退的概念
- 1016. Phone Bills (25)
- c++ vector 动态数组用法
- C++学习笔记一、构造函数和析构函数的概念
- C语言 变量内存地址
- leetcode刷题系列C++-remove element
- 埃拉托斯特尼筛法
- C语言中精华------>指针
- C语言中的数组
- 工厂方法模式
- C语言控制结构 练习题
- leetcode刷题系列C++-3sum
- utilities(C/C++)(二)
- C++ 值传递、指针传递、引用传递详解