6351. 标记所有元素后数组的分数

129 阅读1分钟

题目:
给你一个数组 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
}