From 0d7270aa86b112675dba2b7a9d90cb7a0ad9439b Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 23 Sep 2024 08:56:03 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.1014 No.1014.Best Sightseeing Pair --- .../1014.Best Sightseeing Pair/README.md | 56 ++++++++++++------- .../1014.Best Sightseeing Pair/README_EN.md | 56 +++++++++++++------ .../1014.Best Sightseeing Pair/Solution.cpp | 8 +-- .../1014.Best Sightseeing Pair/Solution.go | 9 +-- .../1014.Best Sightseeing Pair/Solution.java | 8 +-- .../1014.Best Sightseeing Pair/Solution.py | 8 +-- .../1014.Best Sightseeing Pair/Solution.rs | 11 ++++ .../1014.Best Sightseeing Pair/Solution.ts | 7 +-- .../README.md | 4 +- .../README_EN.md | 6 +- 10 files changed, 112 insertions(+), 61 deletions(-) create mode 100644 solution/1000-1099/1014.Best Sightseeing Pair/Solution.rs diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/README.md b/solution/1000-1099/1014.Best Sightseeing Pair/README.md index 232e8f6fbdb6c..fa3cef26de980 100644 --- a/solution/1000-1099/1014.Best Sightseeing Pair/README.md +++ b/solution/1000-1099/1014.Best Sightseeing Pair/README.md @@ -57,11 +57,11 @@ tags: -### 方法一:枚举 + 维护前缀最大值 +### 方法一:枚举 -我们可以在 $[1,..n - 1]$ 的范围内枚举 $j$,那么我们要在 $[0,..j - 1]$ 的范围内找到一个 $i$,使得 $values[i] + values[j] + i - j$ 的值最大。我们可以维护一个前缀最大值,即 $values[i] + i$ 的最大值,那么我们只需要在枚举 $j$ 的过程中,不断地更新答案即可。 +我们可以从左到右枚举 $j$,同时维护 $j$ 左侧元素中 $values[i] + i$ 的最大值 $mx$,这样对于每个 $j$,最大得分为 $mx + values[j] - j$。我们取所有位置的最大得分的最大值即为答案。 -时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。 +时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{values}$ 的长度。空间复杂度 $O(1)$。 @@ -70,10 +70,10 @@ tags: ```python class Solution: def maxScoreSightseeingPair(self, values: List[int]) -> int: - ans, mx = 0, values[0] - for j in range(1, len(values)): - ans = max(ans, values[j] - j + mx) - mx = max(mx, values[j] + j) + ans = mx = 0 + for j, x in enumerate(values): + ans = max(ans, mx + x - j) + mx = max(mx, x + j) return ans ``` @@ -82,9 +82,9 @@ class Solution: ```java class Solution { public int maxScoreSightseeingPair(int[] values) { - int ans = 0, mx = values[0]; - for (int j = 1; j < values.length; ++j) { - ans = Math.max(ans, values[j] - j + mx); + int ans = 0, mx = 0; + for (int j = 0; j < values.length; ++j) { + ans = Math.max(ans, mx + values[j] - j); mx = Math.max(mx, values[j] + j); } return ans; @@ -98,9 +98,9 @@ class Solution { class Solution { public: int maxScoreSightseeingPair(vector& values) { - int ans = 0, mx = values[0]; - for (int j = 1; j < values.size(); ++j) { - ans = max(ans, values[j] - j + mx); + int ans = 0, mx = 0; + for (int j = 0; j < values.size(); ++j) { + ans = max(ans, mx + values[j] - j); mx = max(mx, values[j] + j); } return ans; @@ -112,9 +112,10 @@ public: ```go func maxScoreSightseeingPair(values []int) (ans int) { - for j, mx := 1, values[0]; j < len(values); j++ { - ans = max(ans, values[j]-j+mx) - mx = max(mx, values[j]+j) + mx := 0 + for j, x := range values { + ans = max(ans, mx+x-j) + mx = max(mx, x+j) } return } @@ -124,16 +125,31 @@ func maxScoreSightseeingPair(values []int) (ans int) { ```ts function maxScoreSightseeingPair(values: number[]): number { - let ans = 0; - let mx = values[0]; - for (let j = 1; j < values.length; ++j) { - ans = Math.max(ans, values[j] - j + mx); + let [ans, mx] = [0, 0]; + for (let j = 0; j < values.length; ++j) { + ans = Math.max(ans, mx + values[j] - j); mx = Math.max(mx, values[j] + j); } return ans; } ``` +#### Rust + +```rust +impl Solution { + pub fn max_score_sightseeing_pair(values: Vec) -> i32 { + let mut ans = 0; + let mut mx = 0; + for (j, &x) in values.iter().enumerate() { + ans = ans.max(mx + x - j as i32); + mx = mx.max(x + j as i32); + } + ans + } +} +``` + diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/README_EN.md b/solution/1000-1099/1014.Best Sightseeing Pair/README_EN.md index 4f78d54948adf..0d7302e739308 100644 --- a/solution/1000-1099/1014.Best Sightseeing Pair/README_EN.md +++ b/solution/1000-1099/1014.Best Sightseeing Pair/README_EN.md @@ -55,7 +55,11 @@ tags: -### Solution 1 +### Solution 1: Enumeration + +We can enumerate $j$ from left to right while maintaining the maximum value of $values[i] + i$ for elements to the left of $j$, denoted as $mx$. For each $j$, the maximum score is $mx + values[j] - j$. The answer is the maximum of these maximum scores for all positions. + +The time complexity is $O(n)$, where $n$ is the length of the array $\textit{values}$. The space complexity is $O(1)$. @@ -64,10 +68,10 @@ tags: ```python class Solution: def maxScoreSightseeingPair(self, values: List[int]) -> int: - ans, mx = 0, values[0] - for j in range(1, len(values)): - ans = max(ans, values[j] - j + mx) - mx = max(mx, values[j] + j) + ans = mx = 0 + for j, x in enumerate(values): + ans = max(ans, mx + x - j) + mx = max(mx, x + j) return ans ``` @@ -76,9 +80,9 @@ class Solution: ```java class Solution { public int maxScoreSightseeingPair(int[] values) { - int ans = 0, mx = values[0]; - for (int j = 1; j < values.length; ++j) { - ans = Math.max(ans, values[j] - j + mx); + int ans = 0, mx = 0; + for (int j = 0; j < values.length; ++j) { + ans = Math.max(ans, mx + values[j] - j); mx = Math.max(mx, values[j] + j); } return ans; @@ -92,9 +96,9 @@ class Solution { class Solution { public: int maxScoreSightseeingPair(vector& values) { - int ans = 0, mx = values[0]; - for (int j = 1; j < values.size(); ++j) { - ans = max(ans, values[j] - j + mx); + int ans = 0, mx = 0; + for (int j = 0; j < values.size(); ++j) { + ans = max(ans, mx + values[j] - j); mx = max(mx, values[j] + j); } return ans; @@ -106,9 +110,10 @@ public: ```go func maxScoreSightseeingPair(values []int) (ans int) { - for j, mx := 1, values[0]; j < len(values); j++ { - ans = max(ans, values[j]-j+mx) - mx = max(mx, values[j]+j) + mx := 0 + for j, x := range values { + ans = max(ans, mx+x-j) + mx = max(mx, x+j) } return } @@ -118,16 +123,31 @@ func maxScoreSightseeingPair(values []int) (ans int) { ```ts function maxScoreSightseeingPair(values: number[]): number { - let ans = 0; - let mx = values[0]; - for (let j = 1; j < values.length; ++j) { - ans = Math.max(ans, values[j] - j + mx); + let [ans, mx] = [0, 0]; + for (let j = 0; j < values.length; ++j) { + ans = Math.max(ans, mx + values[j] - j); mx = Math.max(mx, values[j] + j); } return ans; } ``` +#### Rust + +```rust +impl Solution { + pub fn max_score_sightseeing_pair(values: Vec) -> i32 { + let mut ans = 0; + let mut mx = 0; + for (j, &x) in values.iter().enumerate() { + ans = ans.max(mx + x - j as i32); + mx = mx.max(x + j as i32); + } + ans + } +} +``` + diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.cpp b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.cpp index cdcb815b7c063..0d485fc9285e1 100644 --- a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.cpp +++ b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.cpp @@ -1,11 +1,11 @@ class Solution { public: int maxScoreSightseeingPair(vector& values) { - int ans = 0, mx = values[0]; - for (int j = 1; j < values.size(); ++j) { - ans = max(ans, values[j] - j + mx); + int ans = 0, mx = 0; + for (int j = 0; j < values.size(); ++j) { + ans = max(ans, mx + values[j] - j); mx = max(mx, values[j] + j); } return ans; } -}; \ No newline at end of file +}; diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.go b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.go index b55a8a5b9e177..3bcc696bbcbf1 100644 --- a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.go +++ b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.go @@ -1,7 +1,8 @@ func maxScoreSightseeingPair(values []int) (ans int) { - for j, mx := 1, values[0]; j < len(values); j++ { - ans = max(ans, values[j]-j+mx) - mx = max(mx, values[j]+j) + mx := 0 + for j, x := range values { + ans = max(ans, mx+x-j) + mx = max(mx, x+j) } return -} \ No newline at end of file +} diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.java b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.java index 350dd9239f521..3c1b68d47c242 100644 --- a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.java +++ b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.java @@ -1,10 +1,10 @@ class Solution { public int maxScoreSightseeingPair(int[] values) { - int ans = 0, mx = values[0]; - for (int j = 1; j < values.length; ++j) { - ans = Math.max(ans, values[j] - j + mx); + int ans = 0, mx = 0; + for (int j = 0; j < values.length; ++j) { + ans = Math.max(ans, mx + values[j] - j); mx = Math.max(mx, values[j] + j); } return ans; } -} \ No newline at end of file +} diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.py b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.py index 2e4c541daff94..4c55759402395 100644 --- a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.py +++ b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.py @@ -1,7 +1,7 @@ class Solution: def maxScoreSightseeingPair(self, values: List[int]) -> int: - ans, mx = 0, values[0] - for j in range(1, len(values)): - ans = max(ans, values[j] - j + mx) - mx = max(mx, values[j] + j) + ans = mx = 0 + for j, x in enumerate(values): + ans = max(ans, mx + x - j) + mx = max(mx, x + j) return ans diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.rs b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.rs new file mode 100644 index 0000000000000..bdd68f71fa8c9 --- /dev/null +++ b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.rs @@ -0,0 +1,11 @@ +impl Solution { + pub fn max_score_sightseeing_pair(values: Vec) -> i32 { + let mut ans = 0; + let mut mx = 0; + for (j, &x) in values.iter().enumerate() { + ans = ans.max(mx + x - j as i32); + mx = mx.max(x + j as i32); + } + ans + } +} diff --git a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.ts b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.ts index 3cd8d55fa85e8..0c1ec2932f548 100644 --- a/solution/1000-1099/1014.Best Sightseeing Pair/Solution.ts +++ b/solution/1000-1099/1014.Best Sightseeing Pair/Solution.ts @@ -1,8 +1,7 @@ function maxScoreSightseeingPair(values: number[]): number { - let ans = 0; - let mx = values[0]; - for (let j = 1; j < values.length; ++j) { - ans = Math.max(ans, values[j] - j + mx); + let [ans, mx] = [0, 0]; + for (let j = 0; j < values.length; ++j) { + ans = Math.max(ans, mx + values[j] - j); mx = Math.max(mx, values[j] + j); } return ans; diff --git a/solution/1000-1099/1018.Binary Prefix Divisible By 5/README.md b/solution/1000-1099/1018.Binary Prefix Divisible By 5/README.md index f8330e91e9eac..f711ec06b5e4d 100644 --- a/solution/1000-1099/1018.Binary Prefix Divisible By 5/README.md +++ b/solution/1000-1099/1018.Binary Prefix Divisible By 5/README.md @@ -64,9 +64,9 @@ tags: ### 方法一:模拟 -遍历数组,每一次遍历都将当前数字加到前面的数字上,然后对 $5$ 取模,如果结果为 $0$,则当前数字可以被 $5$ 整除,答案设置为 `true`,否则为 `false`。 +我们用一个变量 $x$ 来表示当前的二进制前缀,然后遍历数组 $nums$,对于每个元素 $v$,我们将 $x$ 左移一位,然后加上 $v$,再对 $5$ 取模,判断是否等于 $0$,如果等于 $0$,则说明当前的二进制前缀可以被 $5$ 整除,我们将 $\textit{true}$ 加入答案数组,否则将 $\textit{false}$ 加入答案数组。 -时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。 +时间复杂度 $O(n)$,忽略答案数组的空间消耗,空间复杂度 $O(1)$。 diff --git a/solution/1000-1099/1018.Binary Prefix Divisible By 5/README_EN.md b/solution/1000-1099/1018.Binary Prefix Divisible By 5/README_EN.md index 7acd9a87de2e4..2e3cdd2b53a40 100644 --- a/solution/1000-1099/1018.Binary Prefix Divisible By 5/README_EN.md +++ b/solution/1000-1099/1018.Binary Prefix Divisible By 5/README_EN.md @@ -60,7 +60,11 @@ Only the first number is divisible by 5, so answer[0] is true. -### Solution 1 +### Solution 1: Simulation + +We use a variable $x$ to represent the current binary prefix, then traverse the array $nums$. For each element $v$, we left shift $x$ by one bit, then add $v$, and take the result modulo $5$. If the result equals $0$, it means the current binary prefix is divisible by $5$, and we add $\textit{true}$ to the answer array; otherwise, we add $\textit{false}$ to the answer array. + +The time complexity is $O(n)$, and ignoring the space consumption of the answer array, the space complexity is $O(1)$.