下一個排列

很詭異的題,看了好幾遍題沒看懂說什麼,然後去搜了一下,方法如下:

  1. 從右往左遍歷 找到第一個索引k滿足:nums[k] < nums[k+1],如果不存在就反轉整個數組
  2. 再找第二個索引l,滿足:nums[l] > nums[k]
  3. 交換nums[l]nums[k]
  4. 最後從k+1開始反轉整個數組
class Solution {
   public void nextPermutation(int[] nums) {
        int length = nums.length;
        int k = -1, l = -1;
        for (int i = length - 2; i >= 0; i--) {
            if (nums[i] < nums[i+1]){
                k = i;
                break;
            }
        }
        if (k == -1){
            reverse(nums,0,length - 1);
            return;
        }
        for (int i = length - 1; i >= 0; i--) {
            if (nums[i] > nums[k]){
                l = i;
                break;
            }
        }
        swap(nums, k, l);
        reverse(nums, k+1, length - 1);
    }

    private void reverse(int[] nums, int start, int end) {
        while (start < end){
            swap(nums,start++,end--);
        }
    }

    private void swap(int[] nums, int start, int end) {
        nums[start] = nums[start] ^ nums[end];
        nums[end] = nums[start] ^ nums[end];
        nums[start] = nums[start] ^ nums[end];
    }
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章