zoukankan      html  css  js  c++  java
  • 31.下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

    如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

    必须原地修改,只允许使用额外常数空间。

    以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

    1,2,3 → 1,3,2
    3,2,1 → 1,2,3
    1,1,5 → 1,5,1
    

    算法:

    (1)从后往前遍历,找到第一个比后面小的一个数,记录其下标为i。
    若找不到则表明当前排列为全排列最后一个排列,反转整个排列即可。
    (2)从后往前遍历,找到第一个大于nums[i]的数,记录其下标为j。
    (3)swap(nums[i],nums[j]);
    此时i后面仍然是局部全排列的最后一个排列。
    (4)reverse(nums.begin()+i+1,nums.end()),即反转下标i后面的所有数。
    即将i后面的排列换为局部全排列的第一个排列。
    

    举例:
    1 2 7 4 3 1
    1 2 7 4 3 1
    1 3 7 4 2 1
    1 3 1 2 4 7

    void nextPermutation(vector<int>& nums) {
    	int i, j, n = nums.size();
    	for (int i = n - 2; i >= 0; i--) {
    		if (nums[i + 1] > nums[i]) {
    			//确定i
    			for (int j = n - 1; j > i; --j) {
    				//确定j
    				if (nums[j] > nums[i]) break;
    			}
    			swap(nums[i], nums[j]);
    			reverse(nums.begin() + i + 1, nums.end());
    			return;
    		}
    	}
    	//不存在下一个更大的排列,将数字重新排列为最小的排列
    	reverse(nums.begin(), nums.end());
    }
    

    leetcode原题链接:https://leetcode-cn.com/problems/next-permutation

  • 相关阅读:
    Leetcode 191.位1的个数 By Python
    反向传播的推导
    Leetcode 268.缺失数字 By Python
    Leetcode 326.3的幂 By Python
    Leetcode 28.实现strStr() By Python
    Leetcode 7.反转整数 By Python
    Leetcode 125.验证回文串 By Python
    Leetcode 1.两数之和 By Python
    Hdoj 1008.Elevator 题解
    TZOJ 车辆拥挤相互往里走
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/13687078.html
Copyright © 2011-2022 走看看