思路:從右向左查找,查找第一個左值小於右邊的值;改位置處需要調整;然後處理;找不到,升序
題目:
- 下一個排列
實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
解法:
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
// 時間O(N*N) 空間 O(1)
var nextPermutation = function(nums) {
for (let i = nums.length - 1; i > 0; i--) {
// 找到符合下標i
if (nums[i] > nums[i - 1]) {
let min = nums[i];
let k = i;
// 查找第一個左值小於右邊的值
for (let j = i; j < nums.length ; j++) {
// 查找大於左值小於右值
if (min > nums[j] && nums[i-1] < nums[j]) {
min = nums[j]
k = j
}
}
// 對調
[nums[i - 1], nums[k]] = [nums[k], nums[i - 1]];
//拿到對調後的數組數據
let newArr = nums.filter((item, key) => {
return key >= i;
})
// 將後面的升序
newArr.sort((a, b) => a - b)
for (let m = 0; m < newArr.length; m++) {
nums[i + m] = newArr[m]
}
return nums;
}
}
// 沒找到,升序
nums.sort((a, b) => a - b)
return nums;
};