leetcode 31: 下一個排列
阿新 • • 發佈:2018-11-19
題目:
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
解析:
首先反向查詢第一個比前一個數大的數字, 其下標為i, 然後從這個數字開始往後查詢最小的比nums[i-1] 大的數字, 把它們交換以後在對nums[i]及之後的數字排序
1void nextPermutation(vector<int>& nums) { 2 int i = nums.size()-1; 3 for(; i >0; --i) 4 { 5 if(nums[i] > nums[i-1]) 6 { 7 int m = i; 8 for(int j = i+1; j< nums.size();++j) 9 { 10 if(nums[j] > nums[i-1] && nums[j] <= nums[m]) 11 m =j; 12 } 13 swap(nums[m], nums[i-1]); 14 sort(nums.begin() + i, nums.end()); 15 break; 16 } 17 } 18 if(i == 0) 19 { 20 sort(nums.begin(), nums.end()); 21 } 22 }