题目:
给你一个数组 nums ,它包含若干正整数。
一开始分数 score = 0 ,请你按照下面算法求出最后分数:
- 从数组中选择最小且没有被标记的整数。如果有相等元素,选择下标最小的一个。
- 将选中的整数加到
score中。 - 标记 被选中元素,如果有相邻元素,则同时标记 与它相邻的两个元素 。
- 重复此过程直到数组中所有元素都被标记。
请你返回执行上述算法后最后的分数。
算法:
方法一:堆
简单模拟题,注意排序IntHeap需要稳定排序
import "container/heap"
func findScore(nums []int) int64 {
n := len(nums)
arr := make([][]int, n)
for i := range nums {
arr[i] = []int{i, nums[i]}
}
h := IntHeap(arr)
heap.Init(&h)
// nums的index是否已被标记
marked := make([]int, len(nums))
score := int64(0)
for h.Len() != 0 {
item := heap.Pop(&h).([]int)
if marked[item[0]] == 0 {
if 0 <= item[0] - 1 {
marked[item[0] - 1] = 1
}
if item[0] + 1 < n{
marked[item[0] + 1] = 1
}
score = score + int64(item[1])
}
}
return score
}
type IntHeap [][]int
func (h IntHeap) Len() int {return len(h)}
func (h IntHeap) Swap(i, j int) {h[i], h[j] = h[j], h[i]}
func (h IntHeap) Less(i, j int) bool {
if h[i][1] == h[j][1] {
return h[i][0] < h[j][0]
}
return h[i][1] < h[j][1]
}
func (h *IntHeap) Push(x interface{}) {
*h = append(*h, x.([]int))
}
func (h *IntHeap) Pop() interface{} {
old := *h
n := len(old)
x := old[n - 1]
*h = old[:n - 1]
return x
}