实现下一个排列,它将数字重新排列成按字典顺序排列的下一个更大的数字排列。
如果这样的排列是不可能的,它必须重新排列它作为最低可能的顺序(即,按升序排序)。
替换必须到位,并且只使用恒定的额外内存。
这里有一些例子。输入列在左边,相应的输出列在右边。
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
/* 解题思路: 这道题让我们求下一个排列顺序,由题目中给的例子可以看出来, 如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况, 再来看下面一个例子,有如下的一个数组 1 2 7 4 3 1 下一个排列为: 1 3 1 2 4 7 那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看, 数字逐渐变大,到了2时才减小的,然后再从后往前找第一个比2大的数字, 是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下: 1 2 7 4 3 1 1 2 7 4 3 1 1 3 7 4 2 1 1 3 1 2 4 7 */ #include<iostream> using namespace std; #include<vector> class Solution { public: void nextPermutation(vector<int> &num) { int i, j, n = num.size(); for (i = n - 2; i >= 0; --i) { if (num[i + 1] > num[i]) { for (j = n - 1; j > i; --j) { if (num[j] > num[i]) break; } swap(num[i], num[j]); reverse(num.begin() + i + 1, num.end()); return; } } reverse(num.begin(), num.end()); } }; int main() { int a[100]; int x; int i = 0; vector<int>vec; while (cin >> a[i]) { vec.push_back(a[i]); i++;//注意这里i++对输出结果的影响 x = cin.get(); if (x == '\n') break; } Solution().nextPermutation(vec); for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } system("pause"); return 0; }
标签:排列,数字,一个,31,++,int,num,vec 来源: https://www.cnblogs.com/277223178dudu/p/14645865.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。