實現獲取 下乙個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。這個題其實可以通過幾個例子想明白。找到比當前佇列大的下乙個佇列,其實和調整數字的位是一樣的,比如有乙個數字1234,由1、2、3、4組成的下乙個大的數字是1243。我們可發現,這個操作其實是盡可能不動左側的數字,因為調整左側數字的影響面比較大,盡量調整右側數字。調整右側數字的時候是把第乙個較小的數字用右側的較大數字替換掉。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須 原地 修改,只允許使用額外常數空間。
示例 1:
輸入:nums = [1,2,3]
輸出:[1,3,2]
示例 2:
輸入:nums = [3,2,1]
輸出:[1,2,3]
示例 3:
輸入:nums = [1,1,5]
輸出:[1,5,1]
示例 4:
輸入:nums = [1]
輸出:[1]
1 <= nums.length <= 100
0 <= nums[i] <= 100
再抽象一步,就是從右側開始往前找,找到第乙個變小的數字,用右側剛好比它大的數字替換它,然後右側的序列調整為遞增序列(也就是變為最小排列)。
**如下:
class solution
}// 如果不是完全遞減序列
if (changeindex >= 0)
int temp = nums[changeindex];
nums[changeindex] = nums[changeindex2];
nums[changeindex2] = temp;
}// 重排後面的遞減序列
int l = changeindex + 1, r = nums.length - 1;
while (l < r)
}}
30分鐘 leetcode第31題下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
LeetCode第496題 下乙個更大元素 I
給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。...
LeetCode 下乙個排列(31)
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...