返回介绍

solution / 3000-3099 / 3009.Maximum Number of Intersections on the Chart / README

发布于 2024-06-17 01:02:58 字数 2756 浏览 0 评论 0 收藏 0

3009. 折线图上的最大交点数量

English Version

题目描述

有一条由 n 个点连接而成的折线图。给定一个 下标从 1 开始 的整数数组 y,第 k 个点的坐标是 (k, y[k])。图中没有水平线,即没有两个相邻的点有相同的 y 坐标。

假设在图中任意画一条无限长的水平线。请返回这条水平线与折线相交的最多交点数。

 

示例 1:

输入:y = [1,2,1,2,1,3,2]
输出:5
解释:如上图所示,水平线 y = 1.5 与折线相交了 5 次(用红叉表示)。水平线 y = 2 与折线相交了 4 次(用红叉表示)。可以证明没有其他水平线可以与折线有超过 5 个点相交。因此,答案是 5。

示例 2:

输入:y = [2,1,3,4,5]
输出:2
解释:如上图所示,水平线 y=1.5 与折线相交了 2 次(用红叉表示)。水平线 y=2 与折线相交了 2 次(用红叉表示)。可以证明没有其他水平线可以与折线有超过 2 个点相交。因此,答案是 2。

 

提示:

  • 2 <= y.length <= 105
  • 1 <= y[i] <= 109
  • 对于范围 [1, n - 1] 内的所有 i,都有 y[i] != y[i + 1]

解法

方法一


class Solution {
  public int maxIntersectionCount(int[] y) {
    final int n = y.length;
    int ans = 0;
    int intersectionCount = 0;
    TreeMap<Integer, Integer> line = new TreeMap<>();

    for (int i = 1; i < n; ++i) {
      final int start = 2 * y[i - 1];
      final int end = 2 * y[i] + (i == n - 1 ? 0 : y[i] > y[i - 1] ? -1 : 1);
      line.merge(Math.min(start, end), 1, Integer::sum);
      line.merge(Math.max(start, end) + 1, -1, Integer::sum);
    }

    for (final int count : line.values()) {
      intersectionCount += count;
      ans = Math.max(ans, intersectionCount);
    }

    return ans;
  }
}


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文