From b448596827ca06baa069f4d23a4b74623b24639c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= Date: Sat, 12 Jan 2019 16:39:22 +0800 Subject: [PATCH] Update 31. Next Permutation.md --- solutions/31. Next Permutation.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/solutions/31. Next Permutation.md b/solutions/31. Next Permutation.md index a800ff9..2d990d2 100644 --- a/solutions/31. Next Permutation.md +++ b/solutions/31. Next Permutation.md @@ -11,7 +11,7 @@ Returns true if such permutation exists, otherwise transforms the range into the 下面来分析一下如何实现: 首先应该知道何为下一个排列,若当前排列组成的数为A,则下一个排列组成的数B就是刚好比A大(即没有另外一个排列组成的数C满足A& nums) { int len = nums.size(); - int i, j; - for(i = len - 1; i > 0; i--){ - if(nums[i] > nums[i - 1]) break; - } + int i = len - 1; + while(i > 0 && nums[i] <= nums[i - 1]) i--; if(i == 0) { // 已经是最后一个排列时,需要单独考虑。 reverse(nums.begin(), nums.end()); return; } - for(j = len - 1; j >= i; j--){ - if(nums[j] > nums[i - 1]) break; + + int mid, low = i, high = len - 1; + while(low <= high){ // 二分查找 + mid = low + (high - low) / 2; + if(nums[mid] <= nums[i - 1]) high = mid - 1; + else low = mid + 1; } - swap(nums[j], nums[i-1]); // 用swap击败99%, 若按照下面代码手动实现则击败16% + // int high = len - 1; // 直接查找 + // while(nums[i - 1] >= nums[high]) high--; + + swap(nums[high], nums[i-1]); // 用swap击败99%, 若按照下面代码手动实现则击败16% // int tmp = nums[j]; // nums[j] = nums[i - 1]; // nums[i - 1] = tmp;