列表

详情


2021. 街上最亮的位置

一条街上有很多的路灯,路灯的坐标由数组 lights 的形式给出。 每个 lights[i] = [positioni, rangei] 代表坐标为 positioni 的路灯照亮的范围为 [positioni - rangei, positioni + rangei] (包括顶点)。

位置 p 的亮度由能够照到 p的路灯的数量来决定的。

给出 lights, 返回最亮的位置 。如果有很多,返回坐标最小的。

 

示例 1:

输入: lights = [[-3,2],[1,2],[3,3]]
输出: -1
解释:
第一个路灯照亮的范围是[(-3) - 2, (-3) + 2] = [-5, -1].
第二个路灯照亮的范围是 [1 - 2, 1 + 2] = [-1, 3].
第三个路灯照亮的范围是 [3 - 3, 3 + 3] = [0, 6].

坐标-1被第一个和第二个路灯照亮,亮度为2
坐标0,1,2都被第二个和第三个路灯照亮,亮度为2.
对于以上坐标,-1最小,所以返回-1

示例 2:

输入: lights = [[1,0],[0,1]]
输出: 1

示例 3:

输入: lights = [[1,2]]
输出: -1

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int brightestPosition(vector<vector<int>>& lights) { } };

cpp 解法, 执行用时: 244 ms, 内存消耗: 77.1 MB, 提交时间: 2023-10-22 10:11:46

class Solution {
public:
    int brightestPosition(vector<vector<int>>& lights) {
        vector<pair<int, int>> positions;
        for (auto& light : lights) {
            positions.push_back({light[0] - light[1], 1});
            positions.push_back({light[0] + light[1] + 1, -1});
        }
        sort(positions.begin(), positions.end());
        int maxLight = 0, ans, cur = 0;
        for (auto [p, l] : positions) {
            cur += l;
            if (cur > maxLight) {
                maxLight = cur;
                ans = p;
            }
        }
        return ans;
    }
};

rust 解法, 执行用时: 68 ms, 内存消耗: 10.7 MB, 提交时间: 2023-10-22 10:11:33

use std::collections::BTreeMap;

impl Solution {
    pub fn brightest_position(lights: Vec<Vec<i32>>) -> i32 {
        let mut diff = BTreeMap::new();

        for light in lights {
            *diff.entry(light[0] - light[1]).or_insert(0) += 1;
            *diff.entry(light[0] + light[1] + 1).or_insert(0) -= 1;
        }

        let mut tmp = 0;
        let mut max_light = 0;
        let mut ans = -1;

        for (k, v) in diff {
            tmp += v;

            if tmp > max_light {
                max_light = tmp;
                ans = k;
            }
        }

        ans
    }
}

java 解法, 执行用时: 281 ms, 内存消耗: 78.6 MB, 提交时间: 2023-10-22 10:11:12

class Solution {
    public int brightestPosition(int[][] lights) {
        TreeMap<Integer,Integer> tm = new TreeMap<>();
        for(int[] x : lights) {
            int left = x[0] - x[1];
            // 因为两侧都包含,所以+1
            int right = x[0] + x[1] + 1;
            tm.put(left,tm.getOrDefault(left,0) + 1);
            tm.put(right,tm.getOrDefault(right,0) - 1);
        }
        int ans = Integer.MIN_VALUE;
        // 最大的亮度
        int max = 0;
        // 当前的亮度
        int cur = 0;
        for(Map.Entry<Integer,Integer> entry : tm.entrySet()) {
            cur += entry.getValue();
            if(cur > max) {
                max = cur;
                ans = entry.getKey();
            }
        }
        return ans;
    }
}

python3 解法, 执行用时: 288 ms, 内存消耗: 60.6 MB, 提交时间: 2023-10-22 10:10:56

class Solution:
    def brightestPosition(self, lights: List[List[int]]) -> int:
        diff = defaultdict(int)
        for p, r in lights:
            diff[p - r] += 1
            diff[p + r + 1] -= 1
        d, mx, ans = 0, 0, None
        for k in sorted(diff.keys()):
            d += diff[k]
            if d > mx:
                mx, ans = d, k
        return ans

golang 解法, 执行用时: 200 ms, 内存消耗: 17.6 MB, 提交时间: 2023-10-22 10:10:41

func brightestPosition(lights [][]int) (pos int) {
	a := make([]int, 0, len(lights)*2)
	for _, l := range lights {
		p, d := l[0], l[1]
		a = append(a, (p-d)<<1|1, (p+d+1)<<1) // 最低位存储是区间左端点还是区间右端点
	}
	sort.Ints(a)

	s, maxS := 0, 0
	for i, v := range a {
		s += v&1<<1 - 1 // 根据最低位来 +1 或 -1
		if (i == len(a)-1 || a[i+1]>>1 != v>>1) && s > maxS {
			maxS = s
			pos = v >> 1
		}
	}
	return
}

上一题