题解 | #牛群的编号重排#

牛群的编号重排

https://www.nowcoder.com/practice/220a216469c14a52b4eb6709e041feb1

知识点

思维 双指针

思路

对一个排列,为获得比他小一个字典序的全排列,需要找一个较大的值,和右侧更小的一个值进行交换,这样才能让序列变小。

对于较大的值 i 来说,我们从后倒数第二个开始(给后面留一个数)往前找出第一个大于后方数字的值作为较大值 i。

然后在i的右方找出小于 i 的值,作为较小的值 j,将二者进行交换,交换完之后,i 位置右边的数需要重新排序,这样可以在保证新排列小于原来排列的情况下,使变小的幅度尽可能小。 例如132456,找到的cows[i]为3,cows[j]为2。交换后序列为123456,此时并非小一个的字典序,需要重新对[i+1,n-1]翻转,来维持字典序刚好小一个,得到126543,即为所求。

若这个排列已经是最小字典序的排列,那么i为0,翻转刚好将最小字典序变为了最大字典序。

代码

#include <iterator>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cows int整型vector 
     * @return int整型vector
     */
    vector<int> nextPermutation(vector<int>& cows) {
        // write code here
        int n=cows.size()-2;
        while(n>=0&&cows[n]<=cows[n+1])n--;
        int j=cows.size()-1;
        cout<<n<<endl;
        if(n>=0)
        {
            
            while(j>=0&&cows[n]<=cows[j])
            {
                j--;
            }
            cout<<j<<endl;
            swap(cows[n],cows[j]);
        }       
        reverse(cows.begin()+n+1,cows.end());
        return cows;
    }
};
全部评论

相关推荐

白火同学:先说结论,对于一份实习简历来说,整体还是挺不错的,技术深度和广度都到位,找到一份中小厂的实习没啥问题。 再说说能优化的点吧。 1、量化结果,项目中很多工作量化一下结果给面试官的感受会更直观一些,也能体现你对应用该项技术的理解(在众多技术为什么要用它,运行性能或者说开发效率往往是一大考虑指标;而不是说大家做这种功能都用它,所以我用它)。 2、突出亮点,项目中可以从“工作职责”择一些“个人亮点”另写一块,优先去写开发过程中遇到的xx问题,使用xx技术达到xx效果,针对性去写一些疑杂难的功能,能带出你个人思考和解决的过程。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务