實現獲取 下乙個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須 原地 修改,只允許使用額外常數空間。
示例 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]
比如當前 nums = [1,2,3]。這個數是123,找出1,2,3這3個數字排序可能的所有數,排序後,比123大的那個數 也就是132
如果當前 nums = [3,2,1]。這就是1,2,3所有排序中最大的那個數,那麼就返回1,2,3排序後所有數中最小的那個,也就是1,2,3 -> [1,2,3]
先找出最大的索引 k 滿足 nums[k] < nums[k+1],如果不存在,就翻轉整個陣列;
再找出另乙個最大索引 l 滿足 nums[l] > nums[k];
交換 nums[l] 和 nums[k];
最後翻轉 nums[k+1:]。
舉個例子:
比如 nums = [1,2,7,4,3,1],下乙個排列是什麼?
我們找到第乙個最大索引是 nums[1] = 2
再找到第二個最大索引是 nums[4] = 3
交換,nums = [1,3,7,4,2,1];
翻轉,nums = [1,3,1,2,4,7]
完畢!所以,
時間複雜度:o(n)o(n)o(n)
空間複雜度:o(1)o(1)o(1)
需要注意的是這裡的查詢時倒序查詢的,這樣就可以找到剛好比當前的數大一點的數。
class
solution}if
(firstindex ==-1
)int lastindex =-1
;for
(int i = nums.length -
1;i >=
0;i--)}
swap
(nums ,firstindex ,lastindex)
;reverse
(nums,firstindex +
1,nums.length -1)
;return;}
public
void
reverse
(int
nums ,
int i ,
int j)
}public
void
swap
(int
nums ,
int i ,
int j)
}
leetcode刷題 熱門百題 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?這一題比較好弄的解法其實就是遍歷鍊錶然後將資料存到list裡面,之後判斷list裡面的資料是不是回文就好 defi...
開始刷題LeetCode
今天決定開始刷題,每天至少一題,如果題目確實沒有解決出來沒有關係,但是要保證每天至少接觸了一道新的題目!一定要堅持下去,現在是個菜鳥可能會感覺有點難度,堅持下去,總有一天會好的!今天是第一天,做的第乙個題目 reverse words in a string given an input strin...
leetcode刷題歷程
難度 簡單 題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 ...