題目連結:
題目意譯:
你被給定一個陣列 nums,其由正整數組成。
一開始分數值 = 0。接著執行以下演算法:
選擇陣列中沒有被標記的最小整數。如果有多個數值最小者,則選擇索引值最小者、
將選出來的整數之數值加到分數中、
將選出來的元素以及其兩個相鄰元素(如果存在)都標記起來。
重複以上步驟直到陣列中所有元素都被標記起來。
回傳你執行以上演算法之後得到的分數值。
限制:
1 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 6
範例測資:
範例 1:
輸入: nums = [2,1,3,4,5,2]
輸出: 7
解釋: 我們根據以下順序標記各個元素:
- 1 是最小的未標記元素,所以我們標記它以及其兩個相鄰元素:[2,1,3,4,5,2]。
- 2 是最小的未標記元素,所以我們標記它以及其左邊的相鄰元素:[2,1,3,4,5,2]。
- 4 是為一一個剩餘未標記元素,所以我們標記它:[2,1,3,4,5,2]。
我們的分數為 1 + 2 + 4 = 7。
範例 2:
輸入: nums = [2,3,5,1,3,2]
輸出: 5
解釋: 我們根據以下順序標記各個元素:
- 1 是最小的未標記元素,所以我們標記它以及其兩個相鄰元素:[2,3,5,1,3,2]。
- 2 是最小的未標記元素,由於有兩個 2,因此我們選最左側的那一個。所以我們標記位於索引值 0 的那個 2 以及其右邊的相鄰元素:[2,3,5,1,3,2]。
- 2 是為一一個剩餘未標記元素,所以我們標記它:[2,3,5,1,3,2]。
我們的分數為 1 + 2 + 2 = 5。
解題思維:
就是單純地用一個布林陣列(用來記錄陣列中的元素之標記狀況)以及一個優先佇列(Priority Queue)來取得當前最小元素(如題目所述,如果有多個最小則為索引值最小者)來模擬即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。