下一个排列
2015-08-30 10:54
309 查看
该题的思路是从后向前扫描数组,找到第一对位置 i,j (i < j) 使得 i 位置的值小于 j 位置的值,交换 i 位置和 j 位置的元素值,然后对 i 位置之后的元素进行排序即可。代码如下:
vector<int> nextPermutation(vector<int> &nums) {
// write your code here
int size = nums.size();
//标记数组是否为递减数组
bool flag = false;
//找出从后向前第一个不递增的元素
int i = size - 1;
for(; i > 0; i--){
if(nums[i - 1] < nums[i]){
flag = true;
break;
}
}
//若数组为递减数组,则下一个全排列直接反转数组即可
if(flag == false){
sort(nums.begin(), nums.end());
return nums;
}
//找到第一个比反转元素大的元素
int k = size - 1;
while(nums[k] <= nums[i - 1])
k--;
//交换元素
int tmp = nums[i - 1];
nums[i - 1] = nums[k];
nums[k] = tmp;
//排序剩余元素
sort(nums.begin() + i, nums.end());
return nums;
}
vector<int> nextPermutation(vector<int> &nums) {
// write your code here
int size = nums.size();
//标记数组是否为递减数组
bool flag = false;
//找出从后向前第一个不递增的元素
int i = size - 1;
for(; i > 0; i--){
if(nums[i - 1] < nums[i]){
flag = true;
break;
}
}
//若数组为递减数组,则下一个全排列直接反转数组即可
if(flag == false){
sort(nums.begin(), nums.end());
return nums;
}
//找到第一个比反转元素大的元素
int k = size - 1;
while(nums[k] <= nums[i - 1])
k--;
//交换元素
int tmp = nums[i - 1];
nums[i - 1] = nums[k];
nums[k] = tmp;
//排序剩余元素
sort(nums.begin() + i, nums.end());
return nums;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- 关于指针的一些事情
- 肯特·贝克:改变人生的代码整理魔法
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 网页恶意代码的预防
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- Lua中调用C++函数示例
- Lua中编译执行代码相关的函数详解
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- 更有效率的css代码编写第1/3页
- 代码中到底应不应当写注释?
- C++编写简单的打靶游戏