leetcode刷題 熱門百題 下乙個排列

2021-10-19 07:18:53 字數 1475 閱讀 4847

實現獲取 下乙個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。

如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。

必須 原地 修改,只允許使用額外常數空間。

示例 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 ...