leetcode31. Next Permutation
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int right = nums.size() - 1;
if(right<=0) return ;
int max = INT_MIN;
int maxPos = right;
int newPos = 0;
int temp = 0;
while(right>=0){
if(max>nums[right]){
newPos = floor(binarySearchPos(nums,nums[right],maxPos,nums.size() - 1));
//cout<<newPos<<endl;
while(nums[newPos] == nums[right]) newPos++;
temp = nums[right];
nums[right] = nums[newPos];
nums[newPos] = temp;
quickSort(nums,right+1,nums.size() - 1);
break;
}else{
//cout<<max<<";"<<nums[right]<<endl;
max=nums[right];
maxPos = right;
right--;
}
}
if(right<0){
quickSort(nums,0,nums.size() - 1);
}
// for(int i=0;i<nums.size();i++){
// cout<<nums[i]<<",";
// }
}
double binarySearchPos(vector<int>& nums1, double num, int start, int end) {
int left = start, right = end, medium = 0;
while (left<right) {
medium = left + (right - left) / 2;
if (nums1[medium] - num <0.4) {
right = medium;
}
else if (num - nums1[medium] <0.4) {
left = medium + 1;
}
else {
return medium;
}
}
double left1;
if (nums1[left] - num>0.4 && num - nums1[left] >0.4)
left1 = left;
else if (nums1[left] - num<0.4) {
left1 = left - 0.5;
}
else {
left1 = left + 0.5;
}
return left1;
}
void quickSort(vector<int>& nums,int left,int right){
int temp = 0;
while(left<right){
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
};