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