返回介绍

solution / 1700-1799 / 1788.Maximize the Beauty of the Garden / README_EN

发布于 2024-06-17 01:03:14 字数 6075 浏览 0 评论 0 收藏 0

1788. Maximize the Beauty of the Garden

中文文档

Description

There is a garden of n flowers, and each flower has an integer beauty value. The flowers are arranged in a line. You are given an integer array flowers of size n and each flowers[i] represents the beauty of the ith flower.

A garden is valid if it meets these conditions:

  • The garden has at least two flowers.
  • The first and the last flower of the garden have the same beauty value.

As the appointed gardener, you have the ability to remove any (possibly none) flowers from the garden. You want to remove flowers in a way that makes the remaining garden valid. The beauty of the garden is the sum of the beauty of all the remaining flowers.

Return the maximum possible beauty of some valid garden after you have removed any (possibly none) flowers.

 

Example 1:


Input: flowers = [1,2,3,1,2]

Output: 8

Explanation: You can produce the valid garden [2,3,1,2] to have a total beauty of 2 + 3 + 1 + 2 = 8.

Example 2:


Input: flowers = [100,1,1,-3,1]

Output: 3

Explanation: You can produce the valid garden [1,1,1] to have a total beauty of 1 + 1 + 1 = 3.

Example 3:


Input: flowers = [-1,-2,0,-1]

Output: -2

Explanation: You can produce the valid garden [-1,-1] to have a total beauty of -1 + -1 = -2.

 

Constraints:

  • 2 <= flowers.length <= 105
  • -104 <= flowers[i] <= 104
  • It is possible to create a valid garden by removing some (possibly none) flowers.

Solutions

Solution 1: Hash Table + Prefix Sum

We use a hash table $d$ to record the first occurrence of each aesthetic value, and a prefix sum array $s$ to record the sum of the aesthetic values before the current position. If an aesthetic value $v$ appears at positions $i$ and $j$ (where $i \lt j$), then we can get a valid garden $[i+1,j]$, whose aesthetic value is $s[i] - s[j + 1] + v \times 2$. We use this value to update the answer. Otherwise, we record the current position $i$ of the aesthetic value in the hash table $d$. Next, we update the prefix sum. If the aesthetic value $v$ is negative, we treat it as $0$.

After traversing all the aesthetic values, we can get the answer.

The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the number of flowers.

class Solution:
  def maximumBeauty(self, flowers: List[int]) -> int:
    s = [0] * (len(flowers) + 1)
    d = {}
    ans = -inf
    for i, v in enumerate(flowers):
      if v in d:
        ans = max(ans, s[i] - s[d[v] + 1] + v * 2)
      else:
        d[v] = i
      s[i + 1] = s[i] + max(v, 0)
    return ans
class Solution {
  public int maximumBeauty(int[] flowers) {
    int n = flowers.length;
    int[] s = new int[n + 1];
    Map<Integer, Integer> d = new HashMap<>();
    int ans = Integer.MIN_VALUE;
    for (int i = 0; i < n; ++i) {
      int v = flowers[i];
      if (d.containsKey(v)) {
        ans = Math.max(ans, s[i] - s[d.get(v) + 1] + v * 2);
      } else {
        d.put(v, i);
      }
      s[i + 1] = s[i] + Math.max(v, 0);
    }
    return ans;
  }
}
class Solution {
public:
  int maximumBeauty(vector<int>& flowers) {
    int n = flowers.size();
    vector<int> s(n + 1);
    unordered_map<int, int> d;
    int ans = INT_MIN;
    for (int i = 0; i < n; ++i) {
      int v = flowers[i];
      if (d.count(v)) {
        ans = max(ans, s[i] - s[d[v] + 1] + v * 2);
      } else {
        d[v] = i;
      }
      s[i + 1] = s[i] + max(v, 0);
    }
    return ans;
  }
};
func maximumBeauty(flowers []int) int {
  n := len(flowers)
  s := make([]int, n+1)
  d := map[int]int{}
  ans := math.MinInt32
  for i, v := range flowers {
    if j, ok := d[v]; ok {
      ans = max(ans, s[i]-s[j+1]+v*2)
    } else {
      d[v] = i
    }
    s[i+1] = s[i] + max(v, 0)
  }
  return ans
}
function maximumBeauty(flowers: number[]): number {
  const n = flowers.length;
  const s: number[] = Array(n + 1).fill(0);
  const d: Map<number, number> = new Map();
  let ans = -Infinity;
  for (let i = 0; i < n; ++i) {
    const v = flowers[i];
    if (d.has(v)) {
      ans = Math.max(ans, s[i] - s[d.get(v)! + 1] + v * 2);
    } else {
      d.set(v, i);
    }
    s[i + 1] = s[i] + Math.max(v, 0);
  }
  return ans;
}
use std::collections::HashMap;

impl Solution {
  pub fn maximum_beauty(flowers: Vec<i32>) -> i32 {
    let mut s = vec![0; flowers.len() + 1];
    let mut d = HashMap::new();
    let mut ans = i32::MIN;

    for (i, &v) in flowers.iter().enumerate() {
      if let Some(&j) = d.get(&v) {
        ans = ans.max(s[i] - s[j + 1] + v * 2);
      } else {
        d.insert(v, i);
      }
      s[i + 1] = s[i] + v.max(0);
    }

    ans
  }
}

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

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

发布评论

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