刷题31. Next Permutation

一、题目说明

题目是31. Next Permutation,英文太差看不懂,翻译了一下。才知道是求字典顺序下的下一个排列,不允许使用额外空间。题目难度是Medium!

二、我的实现

首先要进一步理解题目,以1->2->3为例,字典顺序如下:

(1) 1->2->3;
(2) 1->3->2;
(3) 2->1->3;
(4) 2->3->1;
(5) 3->1->2;
(6) 3->2->1;
(7) 1->2->3;

如何从(1)-> (2) ->(3)-> (4) ->(5)-> (6) ->(7)实现状态转换?以(3)->(4)为例:

从列表lists的最右边起,

if(lists[t] < lists[t-1]) {

? swap(lists[t-1],max{lists[t]...lists[listSize-1]})

? sort(lists[t],lists[listSize-1]);

}

从(6)->(7),sort(lists[0],lists[listSize-1])即可。

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Solution {
public:
    void nextPermutation(vector<int>& nums){
        if(nums.size()<=1) return ;
        bool flag = false;
        for(int t=nums.size()-1;t>0;t--){
            if(nums[t]>nums[t-1]){
                //find the smallest between nums[t] to nums[t-1]
                flag = true;
                int max = nums[t];
                int maxIndex = t;

                for(int k=nums.size()-1;k>=t;k--){
                    if(nums[t-1]<nums[k]){
                        max = nums[k];
                        maxIndex = k;
                        break;
                    }
                }
                int tmp = nums[t-1];
                nums[t-1] = nums[maxIndex];
                nums[maxIndex] = tmp;

                //从t..size()-1重新排序
                int len = nums.size()-t;
                for(int s=0;s<(len+1)/2;s++){
                    tmp = nums[t+s];
                    nums[t+s] = nums[nums.size()-s-1];
                    nums[nums.size()-s-1] = tmp;
                 }
                break;
            }
        }
         if(!flag){
            int tmp,len = nums.size();
            for(int t=0;t<(len+1)/2;t++){
                tmp = nums[t];
                nums[t] = nums[len-t-1];
                nums[len-t-1] = tmp;
             }
         }
    }
};
int main(){
    Solution s;
    vector<int> v;

    v = {1,3,2};
    s.nextPermutation(v);
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;

    v = {5,4,7,5,3,2};
    s.nextPermutation(v);
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;

    v = {3,2,1};
    s.nextPermutation(v);
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;

    v = {1,5,1};
    s.nextPermutation(v);
    for(vector<int>::iterator it=v.begin();it!=v.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;

    return 0;
}

三、改进措施

提交后,性能如下:

Runtime: 8 ms, faster than 78.45% of C++ online submissions for Next Permutation.
Memory Usage: 8.6 MB, less than 88.17% of C++ online submissions for Next Permutation.

差不多了,就不优化了。

原文地址:https://www.cnblogs.com/siweihz/p/12237452.html

时间: 2024-11-09 04:43:39

刷题31. Next Permutation的相关文章

leetcode刷题31

今天刷的题是LeetCode第2题,两数相加,现在来做这个题还是很简单的 首先想到的是,吧两个数都提取出来,然后相加,再生成新的链表,但是这个有个问题,就是数据有可能超过int类型的最大数.代码如下: public static ListNode solution(ListNode l1,ListNode l2){ //这种做法是不正确的,因为输入的字符串有可能超过int的最大范围 ListNode head=new ListNode(0); ListNode p=head; StringBui

刷题46. Permutations

一.题目说明 题目是46. Permutations,给一组各不相同的数,求其所有的排列组合.难度是Medium 二.我的解答 这个题目,前面遇到过类似的.回溯法(树的深度优先算法),或者根据如下求解: 刷题31. Next Permutation 我考虑可以用dp做,写了一个上午,理论我就不说了,自己看代码: #include<iostream> #include<vector> #include<unordered_map> using namespace std;

【leetcode刷题笔记】Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example,[1,1,2] have the following unique permutations:[1,1,2], [1,2,1], and [2,1,1]. 题解:跟Permutation差不多,只是这次会有重复的元素,如下图所示,如果只用DFS的话就会产生重复的排列: 上

【leetcode刷题笔记】Sum Root to Leaf Numbers

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number. An example is the root-to-leaf path 1->2->3 which represents the number 123. Find the total sum of all root-to-leaf numbers. For example, 1 / 2 3 T

【leetcode刷题笔记】Longest Consecutive Sequence

Given an unsorted array of integers, find the length of the longest consecutive elements sequence. For example,Given [100, 4, 200, 1, 3, 2],The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4. Your algorithm should run in

刷题感悟 - Guess Number Game II

最近稍微有点懈怠了 刷题不勤了 勉励下自己 这道题目挺有意思的 We are playing the Guess Game. The game is as follows:I pick a number from 1 to n. You have to guess which number I picked.Every time you guess wrong, I'll tell you whether the number I picked is higher or lower.Howeve

COGS2642 / Bzoj4590 [Shoi2015]自动刷题机

Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 906  Solved: 321 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序,每秒,自动刷题机的代码生成模 块会有两种可能的结果: A.写了x行代码. B.心情不好,删掉了之前写的y行代码.(如果y大于当前代码长度则相当于全部删除.) 对于每

刷题计划

我很后悔这一年来被我浪费过的每分每秒,我已经不想再浪费时间了. 平时不好好刷题还想着打比赛? 今年的目标就是刷完紫书第七章的搜索,第八章的贪心,第九章的dp,然后每次的cf补题尽量补到div2的DE题,如果时间有剩余,就学AC自动机等一些数据结构吧. 第一阶段:紫书ch7-ch9  时间11月末-12月31号 第二阶段  训练指南选择性的补充知识点,同时打一些5个小时比赛+补题  时间1月-2月 第三阶段  区域赛真题组队训练

【leetcode刷题笔记】Restore IP Addresses

Given a string containing only digits, restore it by returning all possible valid IP address combinations. For example:Given "25525511135", return ["255.255.11.135", "255.255.111.35"]. (Order does not matter) 题解:深度优先搜索.用resul