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.
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
There are four steps to solve this problem:
1. Find the largest element index that num[index] < num[index+1].
2. If there doesn't exist such index, then the list will be in descending order. Reverse the whole list.
3. Find the largest element index' that num[index'] > num[index] and swap them.
4. Reverse the list from index+1 to the end.
C++ Code:
/* * func: next_permutation * goal: get the next permutation of numbers which is lexicographically next greater one * @param num: the vector of numbers * return: */ void next_permutation(vector<int> &num){ if(num.size() <= 1){ return; } //Start from the end, find the largest index where num[index] < num[index + 1] int index = static_cast<int>(num.size()-2); while(index >= 0){ if(num[index] >= num[index+1]){ --index; }else{ break; } } //If there doesn't exist that i, reverse the whole vector if(index < 0){ reverse(num.begin(), num.end()); }else{ //Find the largest index' where num[index'] > num[index] int index_g = static_cast<int>(num.size()-1); while(index_g > index){ if(num[index_g] > num[index]){ break; }else{ --index_g; } } //Swap num[index'] and num[index] swap(num[index_g], num[index]); //Reverse from index+1 to the end reverse(num.begin()+index+1, num.end()); } }
Python Code:
# func: Implement next permutation, which rearranges numbers into the # lexicographically next greater permutation of numbers. # @param num: input number list # @return: return next permutation def next_permutation(num): if len(num) <= 1: return num #Find the largest index where num[index] < num[index+1] index = len(num)-2 while index >= 0: if num[index] < num[index+1]: break else: index -= 1 #If there doesn't exist that index, reverse the whole list if index < 0: return num[::-1] #Find the largest index' that num[index'] > num[index] index_g = len(num)-1 while index_g > index: if num[index_g] > num[index]: break else: index_g -= 1 #Swap index_g and index tmp = num[index] num[index] = num[index_g] num[index_g] = tmp #Reverse from index + 1 to the end num[index+1:] = reversed(num[index+1:]) return num
No comments:
Post a Comment