zoukankan      html  css  js  c++  java
  • 刷题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.
    

    差不多了,就不优化了。

    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    ASP.NET的票据工具类FormsAuthenticationTicket
    FormsAuthenticationTicket学习笔记
    FormsAuthentication与Session超时时间不一的解决方法
    asp.net mvc 从数据库中读取图片的实现代码
    ASP.NET下载远程图片保存到本地的方法、保存抓取远程图片
    获取客户端的IP地址
    C#实现DNS解析服务
    Linux下安装Nginx详细图解教程
    手动配置Ubuntu Linux系列3-缺省网关和主机名
    web运维第一篇:nginx配置文件详解笔记
  • 原文地址:https://www.cnblogs.com/siweihz/p/12237452.html
Copyright © 2011-2022 走看看