尋找逆序對 i j k 31 下乙個排列

2021-10-07 09:00:30 字數 1232 閱讀 5726

難度中等528實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。

如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

三個變數 i j k,三步

公升序對(i,j),找到第乙個大於i的k交換,逆序j到結束。

字典排序的原理:

下乙個排列意味著,下乙個數比當前的數更大,因此要將後面的大數與前面的小數交換,比如123456更大的數字是123465.

希望下乙個數增加的幅度盡可能的小。因此在盡可能靠右的低位進行交換,越靠前交換最後整個數字越大,因此從後向前查詢。

將乙個盡可能小的大數與前面的小數進行交換。比如123465應該交換54而不是64.因此從後向前遍歷,找到第乙個公升序對(i,j),也就是前面需要交換的小數。

從後向前找到乙個大於小數的大數k,進行交換i和k。

j之後的數字一定為降序,逆置j之後的數字,使其變為公升序。

如果在第三步找不到公升序對,說明原始序列是乙個降序對,那麼直接逆序整個陣列。

**過程

(即:找到整個圖的第乙個凹陷處,用盡可能小的數字去替換掉凹陷處的數字。然後將後面逆序全部改為公升序,更小。)

public

void

nextpermutation

(int

nums)

//從後向前找到公升序對,如果沒有公升序對,那麼說明整個是降序的,就將整個陣列逆序

int i =0;

int j = nums.length-1;

boolean flag =

false

;for

( j = nums.length-

1;j>

0;j--)}

int k = nums.length-1;

//從後向前找第乙個第乙個滿足大於i位置上的數字

if(flag)

k--;}

}else

}public

void

swap

(int

nums,

int i,

int j)

public

void

reverse

(int

nums,

int i,

int j)

}

31 下乙個排列

public void nextpermutation int nums 從後向前找到第乙個不滿足逆序的元素 int i nums.length 2 for i 0 nums i nums i 1 i 注意,這裡有 可以排除含有重複元素的情況 從i 1位置開始,向後查詢比nums i 大的最小元素 ...

31 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...

31 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...