2055.蜡烛之间的盘子
2055.蜡烛之间的盘子
题解
用前缀和算出i位置之前出现过几次盘子
维护两个数组,一个是i左侧出现最近蜡烛的下标,一个是i右侧出现最近蜡烛的下标
最后获得左端点右侧的第一个蜡烛的下标 , 右端点左侧第一个 蜡烛的下标,用前缀和相减即可
代码
package main func platesBetweenCandles(s string, queries [][]int) (ans []int) { n := len(s) preSum := make([]int, n) left := make([]int, n) right := make([]int, n) sum, l, r := 0, -1, -1 for i := 0; i < n; i++ { if s[i] == '*' { sum++ } else if s[i] == '|' { l = i } //统计该位置i为止一共出现了几次* preSum[i] = sum //统计该位置i左侧出现|的下标 left[i] = l } for i := n - 1; i >= 0; i-- { if s[i] == '|' { r = i } //统计该位置i右侧出现|的下标 right[i] = r } for _, v := range queries { lPoint, rPoint := v[0], v[1] //获得左端点右侧的第一个| , 右端点左侧第一个 | 的下标 targetIdxL, targetIdxR := right[lPoint], left[rPoint] if targetIdxL >= 0 && targetIdxR >= 0 && targetIdxL < targetIdxR { ans = append(ans, preSum[targetIdxR]-preSum[targetIdxL]) } else { ans = append(ans, 0) } } return }