leetcode 尋找全排列的下乙個數

2021-09-25 08:21:04 字數 2707 閱讀 1332

給定乙個正整數,實現乙個方法來求出離該整數最近的大於自身的「換位數」。

什麼是換位數呢?就是把乙個整數各個數字的數字進行全排列,從而得到新的整數。例如53241和23541。

題目要求寫乙個方法來尋找最近的且大於自身的換位數。比如下面這樣: 

輸入12345,返回12354

輸入12354,返回12435

輸入12435,返回12453

思路:比如給定整數12354,如何找到離它最近且大於它的換位數呢?

為了和原數接近,我們需要盡量保持高位不變,低位在最小的範圍內變換順序

那麼,究竟需要變換多少位呢?這取決於當前整數的逆序區域

如果所示,12354的逆序區域是最後兩位,僅看這兩位已經是當前的最大組合。若想最接近原數,又比原數更大,必須從倒數第3位開始改變。

怎樣改變呢?12345的倒數第3位是3,我們需要從後面的逆序區域中尋找到剛剛大於3的數字,和3的位置進行互換:

互換後的臨時結果是12453,倒數第3位已經確定,這時候最後兩位仍然是逆序狀態。我們需要把最後兩位轉變回順序,以此保證在倒數第3位數值為4的情況下,後兩位盡可能小:

獲得最近換位數的三個步驟:

1.從後向前檢視逆序區域,找到逆序區域的前一位,也就是數字置換的邊界

2.把逆序區域的前一位和逆序區域中剛剛大於它的數字交換位置

3.把原來的逆序區域轉為順序

/**

* 通俗理解就是: 在乙個整數所包含數字的全部組合中,找到乙個大於且僅大於原數的新整數

* 例如:

* 如果輸入12345,返回12354

* 如果輸入12354,返回12435

* 如果輸入12435, 返回12453

* * (字典序演算法)

* 步驟:

* 1. 從後向前檢視逆序區域,找到逆序區域的前一位,也就是數字置換的邊界。

* 2. 讓逆序區域的前一位和逆序區域中大於它的最小的數字交換位置

* 3. 把原來的逆序區域換為順序區域

* @author pengjie_yao

* @date 2019/7/14 13:47

*/public class findfullarrange ;

for (int i = 0; i < 10; i++) }}

/*** 找到全排列的下乙個數

* @param array

* @return

*/public static int findnearestnumber(int array)

// 2. 讓逆序區域的前一位和逆序區域中大於它的最小的數字交換位置

int numbercopy = arrays.copyof(array, array.length);

numbercopy = exchangehead(numbercopy, index);

// 3. 把原來的逆序區域轉為順序

numbercopy = reverse(numbercopy, index);

return numbercopy;

}/**

** 獲取逆序區域的前一位,比如 12354, 則54是逆序,則獲取逆序對應的位置,即5的小標

* @param array

* @return

*/private static int findtransferpoint(int array)

}return 0;

}/**

* 在逆序區域的前一位和逆序區域大於它的最小數字交換位置,

* 例如: 12354,則前一位是3,大於它的最小數字為4,從而變成12453

* @param numbercopy

* @param index

*/private static int exchangehead(int numbercopy, int index)

}return numbercopy;

}/**

* 將逆序區域轉為順序

* @param numberarray

* @param index

*/private static int reverse(int numberarray, int index)

return numberarray;

}/**

* 輸出陣列

* @param numbers

*/private static void outputnumbers(int numbers)

system.out.println();}}

LeetCode 全排列 回溯

傳送門 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 參考官方題解 時間複雜度是 o k 1n p n,k o sum p n,k o k 1 n p n,k p n k n n k n n ...

leetcode 騰訊 全排列

原題 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 分析 首先從列表的第乙個元素開始,將其放到第一位 然後copy列表,將該元素刪掉,在新得到的列表中一次將元素填在後面 def permute...

LeetCode 回溯 全排列

給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 使用回溯來做。回溯也是在模擬人做排列的方法。例如做 1,2,3 的排列 第一步有3個數 1,2,3 可以選,先選1,此時結果為 1 接下來還有...