題目連結:
題目意譯:
你被給定一個其為 n 個整數之排列且索引值從 0 開始數的陣列 nums。
一個排列如果第一個數字等於 1 且最後一個數字為 n 的話,則被稱為是「半排序的」。你可以執行任意次下列操作直到你將 nums 變為半排序的排列為止:
選擇 nums 中兩個相鄰元素,並交換兩者。
回傳讓 nums 變為半排序的排列最少所需操作數。
一個排列為長度為 n 且包含 1 到 n 之間所有整數恰好一次的序列。
限制:
2 ≦ nums.length == n ≦ 50
1 ≦ nums[i] ≦ 50
nums 為一個排列。
範例測資:
範例 1:
輸入: nums = [2,1,4,3]
輸出: 2
解釋: 我們可以用以下操作序列來使排列變成半排序:
1 - 交換 i = 0 和 j = 1。排列變成 [1,2,4,3]。
2 - 交換 i = 2 和 j = 3。排列變成 [1,2,3,4]。
可以證明不存在少於兩個操作的序列來使排列變成半排序的。
範例 2:
輸入: nums = [2,4,1,3]
輸出: 3
解釋: 我們可以用以下操作序列來使排列變成半排序:
1 - 交換 i = 1 和 j = 2。排列變成 [2,1,4,3]。
2 - 交換 i = 0 和 j = 1。排列變成 [1,2,4,3]。
3 - 交換 i = 2 和 j = 3。排列變成 [1,2,3,4]。
可以證明不存在少於三個操作的序列來使排列變成半排序的。
範例 3:
輸入: nums = [1,3,4,2,5]
輸出: 0
解釋: 該排列已經是一個半排序的了。
解題思維:
由於半排序的排列一定要 1 在開頭、n 在結尾。
因此我們也只能把 1 在 nums 中原本的位置一路移動到開頭,然後把 n 在 nums 中原本的位置一路移動到結尾(1 先做還是 n 先做不重要,只要 1 和 n 不走「回頭路」必定會得到最佳解)。
把上述過程中的交換次數加總即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。