什么网站可以发布广告,让php运行于wordpress,制作一个个人网站,乐清企业网站建设1. 题目
实现获取下一个排列的函数#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列#xff0c;则将数字重新排列成最小的排列#xff08;即升序排列#xff09;。
必须原地修改#xff0c;只允许使用额外常数空间。…1. 题目
实现获取下一个排列的函数算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列则将数字重新排列成最小的排列即升序排列。
必须原地修改只允许使用额外常数空间。
以下是一些例子输入位于左侧列其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1来源力扣LeetCode 链接https://leetcode-cn.com/problems/next-permutation 著作权归领扣网络所有。商业转载请联系官方授权非商业转载请注明出处。
2. 解题
类似的题目 程序员面试金典 - 面试题 05.04. 下一个数线性扫描 LeetCode 1053. 交换一次的先前排列
2.1 next_permutation
bool prev_permutation (BidirectionalIterator first, BidirectionalIterator last);
没有下一个更小或者更大的返回的是falseclass Solution {
public:void nextPermutation(vectorint nums) {next_permutation(nums.begin(),nums.end());}
};4 ms 6.8 MB
2.2 从后往前找第一个下降点 找到下降点 i向后找比 i 点大的最小的数进行交换最后把 i 后面的数字升序排列反转即可
class Solution {
public:void nextPermutation(vectorint nums) {if(nums.size() 1)return;int i nums.size()-2, j, n nums.size();while(i 0 nums[i] nums[i1])i--;//找下降点if(i0){j i1;while(j n nums[i] nums[j])j;//找比 i 点大的最小点swap(nums[i], nums[j-1]); }reverse(nums,i1,n-1);//反转 i1, end}inline void reverse(vectorint a, int l, int r){while(l r)swap(a[l],a[r--]);}
};0 ms 6.9 MB