摘要:解決思路有一首歌名是下一個天亮,不過和這道題沒什么關(guān)系。根據(jù)這兩個例子猜測,需要兩個輔助的方法,一個是交換,另一個是逆序。所以第一步的思路就是從后往前找,找一對兒符合要求的相鄰數(shù)字。這道題的關(guān)鍵在于,找到規(guī)律,數(shù)學(xué)上的規(guī)律。
題目內(nèi)容
給出一個數(shù)組,重新排列,返回『下一個排列,題目的描述中還給出了幾個例子。
解決思路有一首歌名是下一個天亮,不過和這道題沒什么關(guān)系。還有一類題是已有一堆數(shù)字要返回所有的排列方式,和這道題也沒什么關(guān)系。按照題目的描述中的例子,比如:
[1,2,3] -> [1,3,2] 觀察了一下,是交換了2和3的位置。
[3,2,1] -> [1,2,3]這個就是整個數(shù)組的逆序排列。
根據(jù)這兩個例子猜測,需要兩個輔助的方法,一個是交換(swap),另一個是逆序(reverse)。
繼續(xù)看,交換的地方應(yīng)該是相鄰兩個數(shù)字后一個比前一個大的情況,而且靠后的優(yōu)先,比如[#$%,1,2,3]返回的也是[#$%,1,3,2]。所以第一步的思路就是從后往前找,找一對兒符合要求的相鄰數(shù)字。如果找到頭都沒找到,那可以直接逆序輸出返回結(jié)果了。
找到這對兒之后,小的數(shù)字肯定要交換到后面的,先設(shè)定這個小數(shù)字的位置是first。然后要交換的數(shù)字是first后面比它大的里面最小的,就是貼著頭皮理發(fā)的感覺。交換過來之后,再把first后面的部分逆序輸出就好了。
這道題的關(guān)鍵在于,找到規(guī)律,數(shù)學(xué)上的規(guī)律。關(guān)鍵的關(guān)鍵在于,找不到規(guī)律就看discussion吧。
public class Solution { public void nextPermutation(int[] nums) { //排除corner case if(nums == null || nums.length < 2) return; //找那對兒數(shù)字 int right = nums.length-1; while(right > 0){ if(nums[right-1] < nums[right]){ break; } right--; } //沒找著符合要求的情況,直接reverse。 if(right == 0){ reverse(nums, 0, nums.length-1); return; } int first = right-1; int nextBig = right; while(right < nums.length){ //要大,還不能太大。 if(nums[right] <= nums[nextBig] && nums[right] > nums[first]){ nextBig = right; } right++; } swap(nums, first, nextBig); reverse(nums, first+1, nums.length-1); } private void swap(int[] nums, int first, int second){ int temp = nums[first]; nums[first] = nums[second]; nums[second] = temp; return; } private void reverse(int[] nums,int start, int end){ while(start < end){ int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } }復(fù)雜度分析
這個很顯然是O(n)了,第一遍找一對兒數(shù)字的時候掃了一遍,然后第二次再找nextBig的時候又掃了一遍,最后逆序輸出,掃了好幾次,最后依然是O(n)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64963.html
摘要:解題思路這道題是要將排列按字典序排列,然后求出下一個排列,一種辦法是我們先求出所有的排序情況,但是題目規(guī)定不能占有額外空間。每次求出一個數(shù)字后,要及時的把它從中刪除掉。采用來構(gòu)造結(jié)果序列。 PermutationsGiven a collection of distinct numbers, return all possible permutations. For example, ...
摘要:判斷一個能否組成一個第一次出現(xiàn)增加一,第二次出現(xiàn)減少一。出現(xiàn)偶數(shù)次的最終對被抵消。出現(xiàn)基數(shù)詞的則會讓加一。類似于,奇數(shù)個的那個單獨考慮,必須放中間。得到各個字符一半數(shù)量的長度數(shù)字的終止條件,利用的對稱性輸出結(jié)果。 Given a string s, return all the palindromic permutations (without duplicates) of it. R...
摘要:題目內(nèi)容比較不同的版本號,并根據(jù)大小返回,或。并提醒版本意思是第二代的第五次升級,反正不是數(shù)字上的的意思。代碼拆分兩個字符串這里用最大的長度作為循環(huán)范圍因為循環(huán)范圍是最大長度,所以缺的位置補復(fù)雜度分析,和分別是兩個字符串的長度。 題目內(nèi)容 比較不同的版本號,并根據(jù)大小返回-1,1或0。并提醒2.5版本意思是第二代的第五次升級,反正不是數(shù)字上的2.5的意思。 解決思路 直觀的想法是,找到...
摘要:所以這題先建立一個對應(yīng)的,然后掃一遍字符串就可以了。復(fù)雜度分析第二題題目內(nèi)容解決思路一看關(guān)鍵詞,通常都是,深搜一遍,挖地三尺,雁過拔毛。復(fù)雜度分析第三題題目內(nèi)容解決思路復(fù)雜度分析 該系列共三道題,Company Tag只有一個Google,那就必須要做了。 第一題題目內(nèi)容 A strobogrammatic number is a number that looks the same ...
摘要:題目內(nèi)容因為這道題被鎖住了,在寫這篇文章時還有天就要過期了,把原題也貼上來。題目要求,樹的結(jié)構(gòu)是每個當(dāng)右邊子節(jié)點的,它肯定有個,就是它的根節(jié)點肯定有個左邊子節(jié)點,也就是說它是二胎。遞歸設(shè)置終止條件,在空節(jié)點或最左邊的葉子處終止。 題目內(nèi)容 Given a binary tree where all the right nodes are either leaf nodes with a...
閱讀 1176·2021-11-15 18:14
閱讀 3650·2021-11-15 11:37
閱讀 770·2021-09-24 09:47
閱讀 2458·2021-09-04 16:48
閱讀 2190·2019-08-30 15:53
閱讀 2396·2019-08-30 15:53
閱讀 401·2019-08-30 11:20
閱讀 1247·2019-08-29 16:08