• 31.下一个排列


    实现下一个排列,它将数字重新排列成按字典顺序排列的下一个更大的数字排列。

    如果这样的排列是不可能的,它必须重新排列它作为最低可能的顺序(即,按升序排序)。

    替换必须到位,并且只使用恒定的额外内存。

    这里有一些例子。输入列在左边,相应的输出列在右边。

    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 == '
    ')
    			break;
    	}
    
    	Solution().nextPermutation(vec);
    	for (int i = 0; i < vec.size(); i++)
    	{
    		cout << vec[i] << " ";
    	}
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    [转].net mvc + vuejs 的项目结构
    Outlook IMAP 修改PST文件存储路径
    VS2017 性能优化方法
    查询存储过程所需参数
    如何保障微服务架构下的数据一致性
    sqlserver批量给用户配置存储过程权限
    vue中刷新当前页面或重新加载的两种方法
    vue history模式下的微信支付,及微信支付授权目录的填写,处理URL未注册
    Vue 四行代码实现无感知上拉加载更多
    2019年前端必用正则(js)
  • 原文地址:https://www.cnblogs.com/277223178dudu/p/14645865.html
Copyright © 2020-2023  润新知