摘要:我們所找到的這個(gè)元素就是排序需要改變的第一個(gè)元素。然后我們選取一個(gè)剛好大于此元素的數(shù),與當(dāng)前元素進(jìn)行替換。并對(duì)后面的所有元素重新按照升序排列就可以得到最終的答案。
題目詳情
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.想法
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.題目的意思是找到當(dāng)前元素排列的‘下一個(gè)排列’。那么什么叫‘下一個(gè)排列呢’?這里舉個(gè)例子,比如說(shuō)元素1,2,3。它們的全排列是‘1,2,3’,‘1,3,2’,‘2,1,3’,‘2,3,1’,‘3,1,2’,‘3,2,1’因此比如求‘123’的下一個(gè)排列,就應(yīng)該返回‘1,3,2’.
如果當(dāng)前的序列不存在‘下一個(gè)排列’,那么就返回完全升序的第一個(gè)排列。例子: 左側(cè)一列是輸入,右側(cè)是正確的輸出:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
當(dāng)我們要求一個(gè)排列的‘下一個(gè)排列’,我們需要意識(shí)到問(wèn)題的關(guān)鍵在于從數(shù)組末端遍歷到的,第一個(gè)不滿足nums[i] <= nums[i+1]條件的元素。
我們所找到的這個(gè)元素就是排序需要改變的第一個(gè)元素。
然后我們選取一個(gè)剛好大于此元素的數(shù),與當(dāng)前元素進(jìn)行替換。并對(duì)后面的所有元素重新按照升序排列就可以得到最終的答案。
我描述的不是很清晰,這里引用一張leetcode上的圖講解
解法public void nextPermutation(int[] nums) { int length = nums.length; int i= length-2; while(i>=0 && nums[i+1] <= nums[i])i--; if(i >= 0){ int j = length -1; while(j >= 0 && nums[j] <= nums[i])j--; swap(nums,i,j); } reverse(nums,i+1); } public void reverse(int[] nums,int start){ int end = nums.length-1; while(start < end){ swap(nums,start,end); start ++; end --; } } public void swap(int[] nums,int i,int j){ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76314.html
摘要:如果當(dāng)前數(shù)字代表的整數(shù)值已經(jīng)是所有排列組合中的最大值,則返回當(dāng)前數(shù)字組成的最小值??墒沁@意味著大量無(wú)用的數(shù)字的生成和比較。一個(gè)數(shù)字中的各個(gè)位上的數(shù)如何調(diào)整順序才能獲得一個(gè)最小的更大值。其次,要保證移動(dòng)之后,高位以后的值為最小值。 題目要求 Implement next permutation, which rearranges numbers into the lexicographi...
摘要:邊界條件,這時(shí)候之后只有一個(gè)值數(shù)組一直遞減,這時(shí)候變成,沒(méi)有,只需要從到的所有數(shù)。 31. Next Permutation 題目鏈接:https://leetcode.com/problems... 這道題就是找規(guī)律,可以看出來(lái)下一個(gè)permutation的規(guī)律是:從右往左掃,找到第一個(gè)滿足:nums[i-1] < nums[i]條件的,再找到從右到左第一個(gè)比nums[i-1]大的數(shù)...
摘要:因?yàn)樵黾痈呶粫?huì)帶來(lái)更大的增益。所以對(duì)于一個(gè)長(zhǎng)為的序列,我們?cè)黾拥谖坏那疤崾?,前位已?jīng)達(dá)到了最大排列方法。因?yàn)槭钦蚁乱粋€(gè)數(shù),所以我們要找一個(gè)比小卻盡可能大的數(shù),所以找到。把換到的位置后,后三位仍然是個(gè)降序的排列。 Next Permutation Implement next permutation, which rearranges numbers into the lexicogr...
摘要:解題思路這道題是要將排列按字典序排列,然后求出下一個(gè)排列,一種辦法是我們先求出所有的排序情況,但是題目規(guī)定不能占有額外空間。每次求出一個(gè)數(shù)字后,要及時(shí)的把它從中刪除掉。采用來(lái)構(gòu)造結(jié)果序列。 PermutationsGiven a collection of distinct numbers, return all possible permutations. For example, ...
摘要:比如我們很容易知道下一個(gè)數(shù)字是。從尾到頭找,第一段的部分出現(xiàn)。后面的部分就可以有更大的組合。這里是在遞減序列中找到下一個(gè)比大的數(shù)字,作為序列的頭。尾部的遞減序列變成遞增序列。 Implement next permutation, which rearranges numbers into the lexicographically next greater permutation o...
閱讀 2764·2021-09-24 09:47
閱讀 4384·2021-08-27 13:10
閱讀 3036·2019-08-30 15:44
閱讀 1303·2019-08-29 12:56
閱讀 2609·2019-08-28 18:07
閱讀 2627·2019-08-26 14:05
閱讀 2593·2019-08-26 13:41
閱讀 1279·2019-08-26 13:33