相同元素的间隔之和

给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。

arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和 arr[j] 之间的间隔是 |i - j| 。

返回一个长度为 n 的数组 intervals ,其中 intervals[i] 是 arr[i] 和 arr 中每个相同元素(与 arr[i] 的值相同)的 间隔之和 。

注意:|x| 是 x 的绝对值。

/**
 * 以下两种方式时间复杂度不通过 题解没看懂
 */
const getDistances = (arr = [2, 1, 3, 1, 2, 3, 3]) => {
    arr.unshift(-1)
    const res = []
    const len = arr.length
    for (let i = 1; i < len; i++) {
        const v = arr[i]
        arr[i] = -1
        let index = 0
        let sum = 0
        while (index !== -1) {
            index = arr.indexOf(v, index + 1)
            if (index !== -1) {
                sum += Math.abs(i - index)
            }
        }
        res.push(sum)
        arr[i] = v
    }
    return res
};

const getDistances = (arr = [2, 1, 3, 1, 2, 3, 3]) => {
    const map = {}
    const len = arr.length
    const res = []
    arr.forEach((v, i) => {
        if (!map[v]) {
            map[v] = []
        }
        map[v].push(i)
    })
    for (let i = 0; i < len; i++) {
        const v = arr[i]
        let sum = 0
        for (let j = 0; j < map[v].length; j++) {
            if (i !== map[v][j]) {
                sum += Math.abs(i - map[v][j])
            }
        }
        res.push(sum)
    }
    return res
};

  

posted @ 2023-02-05 23:23  671_MrSix  阅读(16)  评论(0编辑  收藏  举报