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).spa
The replacement must be in-place, do not allocate extra memory.code
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
blog
這道題題目一開始沒看懂,其實它的意思就是輸入一個整數數組,須要輸出比這個數組「大」的最小數組,好比輸入[1,2,3],把它當作123,而後比123的由這三個數字組成的最小數是132,因此應該輸出[1,3,2]。排序
個人方法是用暴力方法。首先從後往前找到須要交換的數字位置(從後往前由於後面的數是least significant的位,這樣有利於找到比輸入大的最小數組 。好比輸入[1,2,3],從3往前,比較3與它以前的數字,找到第一個比它小的數記錄下來,做爲可能須要交換的數字(之因此是可能由於有特殊狀況,好比[1,5,6,2],這個時候比2小的是1,可是注意到5也比6小,交換5,6獲得1652,交換1,2獲得2561,明顯1652是符合要求的而非2561)把可能須要交換的數字(索引記作front和end,好比1的索引爲front和2的索引爲end)記錄下來之後從起始索引減一再從新往前找,循環直到數組頭部.在這過程當中,若是新front的索引更大,則替換front和end。最終獲得的front和end就是須要交換的數字索引。交換完以後把front以後的數字從小到大排序,便可獲得答案。索引
1 class Solution { 2 public: 3 void swap(vector<int>& nums, int j){ //若是出現輸入數組已是最大(降序排列), 則reverse數組 4 int temp; 5 temp = nums[j]; 6 nums[j] = nums[nums.size()-1-j]; 7 nums[nums.size()-1-j] = temp; 8 } 9 10 int findSwapPoint(vector<int>& nums,int startIndex){ 11 int currentFrontPoint = -1,currenEndPoint = -1;//記錄須要交換的兩點索引 12 while(startIndex>0){ //從後往前,直到起始點索引等於1 13 for(int i = startIndex-1 ; i >= 0 ; i--){//從起始點索引-1的點開始和索引點比較 14 if(nums[i]<nums[startIndex]){ //該點小於索引點 15 if(i>currentFrontPoint){ //該店的索引大於當前記錄的需交換索引點 16 currentFrontPoint = i; //更新需交換索引點 17 currenEndPoint = startIndex; 18 } 19 } 20 } 21 startIndex --; //索引減一,更新索引點 22 } 23 int temp = nums[currenEndPoint]; 24 nums[currenEndPoint] = nums[currentFrontPoint]; 25 nums[currentFrontPoint] = temp; 26 return currentFrontPoint; 27 } 28 void nextPermutation(vector<int>& nums) { 29 int len = nums.size(); 30 bool isDecreaseOrder = true; 31 int swapPoint; 32 for(int i = len-1 ;i>0 ; i--){ 33 if(nums[i]>nums[i-1]){ 34 isDecreaseOrder = false;//判斷是否降序排列 35 break; 36 } 37 } 38 if(isDecreaseOrder == true){//逆置數組 39 for(int j = 0 ; j <= (len-1)/2 ; j++){ 40 swap(nums,j); 41 } 42 } 43 else{ 44 swapPoint = findSwapPoint(nums,len-1);//找到須要交換的位置索引 45 for(int k = swapPoint+1; k<len-1 ;k++) { //sort nums[i+1]~nums[len-1] in increase order //升序排列索引以後的元素 46 int minNum = nums[k]; 47 int index = k; 48 for(int l = k+1 ;l < len ;l++){ 49 if(nums[l]<minNum){ 50 minNum = nums[l]; 51 index = l; 52 } 53 } 54 int temp = nums[k]; 55 nums[k] = nums[index]; 56 nums[index] = temp; 57 } 58 } 59 } 60 };