力扣(LeetCode)31

題目地址:
https://leetcode-cn.com/probl...java

題目描述:
實現獲取下一個排列的函數,算法須要將給定數字序列從新排列成字典序中下一個更大的排列。算法

若是不存在下一個更大的排列,則將數字從新排列成最小的排列(即升序排列)。數組

必須原地修改,只容許使用額外常數空間。函數

如下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1code

解答:
直接給出步驟:
1從右到左掃描數組找出第一個升序對(nums[j-1],nums[j])
2從右到左掃描數組找出第一個大於nums[j-1]的數nums[k]
3交換nums[j-1],nums[k]
4對num[j...nums.length-1]轉置。leetcode

java ac代碼:get

class Solution {
    public void nextPermutation(int[] nums) {
        boolean flag = true;
        int i = 0;
        for(;i < nums.length-1;i++)
            if(nums[i] < nums[i+1])
            {
                flag = false;
                break;
            }
        if(flag)
        {
            int x = 0,y = nums.length-1;
            while(x < y)
            {
                swap(nums,x,y);
                x++;
                y--;
            }
        }
        else
        {
            i = nums.length-1;
            while(i >= 1)
                if(nums[i] <= nums[i-1])i--;
            else break;
            int j = nums.length-1;
            for(;j >= 0;j--)
                if(nums[j] > nums[i-1])break;
            swap(nums,i-1,j);
            int x = i,y = nums.length-1;
            while(x < y)
            {
                swap(nums,x,y);
                x++;
                y--;
            }
        }
        
        
    }
    
    void swap(int[] nums,int x,int y)
    {
          int temp = nums[x];
          nums[x] = nums[y];
          nums[y] = temp;
        
    }
}
相關文章
相關標籤/搜索