31. 下一個排列

image.png

如何來求解呢?直接看例子
原數組nums:1 2 4 3 6 5
第一輪:從右往左遍歷,去找第一次出現nums【i】>nums【i+1】,去記錄nums【i】和i,
在例子中,3<6,則nums【i】=3;
第二輪:第二輪從右往左遍歷,找第一個比nums【i】大的數字,記錄該數字res和其索引
然后去交換nums【i】和res
在例子中,5是第一個大于3的,res=5
把3和5交換,得到1 2 4 5 6 3
然后去把nums[i+1:nums.length-1],按升序去進行排列 1 2 4 5 3 6
為什么這樣可以得到下一個排列呢?
其實也簡單,如果出現第一個nums【i】>nums【i+1】,說明nums【i】之后已經排列到最大值了,只能在第i位來更換數字進行排列,那這時候,我們就去找第一個大于nums【i】的值,其實就是找到最小大于nums【i】的值,交換位置就可以。
但是,在更換第i位數字后,說明之后應該是最小值,代表不需要進行修改
自己用了比較low的方法寫的,重要的是思想

class Solution {
    public void nextPermutation(int[] nums) {
        int count=1;
        for(int i=0;i<nums.length-1;i++){
            if(nums[i]>=nums[i+1]){
                count++;
            }
        }
        if(count==nums.length){
            Arrays.sort(nums);
        }else{
        
        int temp=0;
        int temp1=0;
        int temp2=0;
        int temp3=0;
        for(int i=nums.length-1;i>=0;i--){
            if(nums[i-1]<nums[i]){
                temp=nums[i-1];
                temp1=i-1;
                break;
            }
        }

        for(int i=nums.length-1;i>=0;i--){
            if(nums[i]>temp){
               temp2=nums[i];
               temp3=i;
                break;
            }
        }


        int temp0=0;
        temp0=nums[temp1];
        nums[temp1]=nums[temp3];
        nums[temp3]=temp0;


        ArrayList<Integer> list=new ArrayList<Integer>();
        for(int i=temp1+1;i<nums.length;i++){
            list.add(nums[i]);
        }
       list.sort(Comparator.naturalOrder());
        for(int i=temp1+1;i<nums.length;i++){
            nums[i]=list.get(i-temp1-1);
        }
        }
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。如果不存在下一個更大的排列,則...
    Herz21閱讀 80評論 0 0
  • 題目描述 實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。如果不存在下一個更大...
    李偉13閱讀 160評論 0 0
  • 題目描述 實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。 如果不存在下一個更...
    youzhihua閱讀 185評論 0 1
  • 題目鏈接難度:中等 類型: 數組 實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典...
    wzNote閱讀 1,053評論 0 5
  • 題目描述: 實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。如果不存在下一個更...
    oneoverzero閱讀 94評論 0 0

友情鏈接更多精彩內容