数据结构与算法练习29

下一个排列

在这里插入图片描述

解题思路:

后序遍历找到前一个比后一个小的数,用 j 记录下位置,再从 j 忘后找到最小的比它大的数,交换,交换后不一定就是最后的结果,要把 j 后面的数升序排列就得到最终结果。

代码:

    public void NextPermutation(int[] nums)     
    {     
       int i=nums.Length-1;        
       int j=0;       
       while(i>0)       
       {         
          if(nums[i]<=nums[i-1])            
          {             
             i--;            
          }            
          else            
          {             
             j=i-1;               
             break;            
          }        
        }//用j记录下找到需要交换的数字的位置。        
        while(nums[j]<nums[i]&&i<nums.Length-1)        
        {          
           if(nums[j]<nums[i+1])            
           {            
               i++;            
           }            
           else break;        
        }        
        if(i==0)        
        {        
            int a=0,b=nums.Length-1;            
            while(a<b)            
            {            
                int temp=nums[a];                
                nums[a]=nums[b];                
                nums[b]=temp;                
                a++;                
                b--;            
            }        
        }//说明不存在更大序列,重排成最小序列。        
        else        
        {        
            int flag=nums[i];           
            nums[i]=nums[j];            
            nums[j]=flag;            
            for(int n=j+1;n<nums.Length-1;n++)           
            {           
                 int min=n;                
                 for(int m=n+1;m<nums.Length;m++)               
                 {               
                      if(nums[m]<nums[min])                    
                      {                    
                         min=m;                   
                      }                               
                 }                
                 int flag2=nums[n];                
                 nums[n]=nums[min];                
                 nums[min]=flag2;                           
             }//j后面的数也要升序排列。        
         }//此时交换。    
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值