Skip to content

Commit 472fab5

Browse files
authored
feat: add solutions to lc problems: No.2154,2155 (doocs#3281)
* No.2154.Keep Multiplying Found Values by Two * No.2155.All Divisions With the Highest Score of a Binary Array
1 parent 3edf84b commit 472fab5

File tree

13 files changed

+291
-247
lines changed

13 files changed

+291
-247
lines changed

solution/2100-2199/2154.Keep Multiplying Found Values by Two/README.md

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,13 @@ tags:
7171

7272
<!-- solution:start -->
7373

74-
### 方法一
74+
### 方法一:哈希表
75+
76+
我们用一个哈希表 $\textit{s}$ 记录数组 $\textit{nums}$ 中的所有数字。
77+
78+
接下来,我们从 $\textit{original}$ 开始,如果 $\textit{original}$ 在 $\textit{s}$ 中,我们将 $\textit{original}$ 乘以 $2$,直到 $\textit{original}$ 不在 $\textit{s}$ 中,返回 $\textit{original}$。
79+
80+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{nums}$ 的长度。
7581

7682
<!-- tabs:start -->
7783

@@ -110,9 +116,10 @@ class Solution {
110116
class Solution {
111117
public:
112118
int findFinalValue(vector<int>& nums, int original) {
113-
unordered_set<int> s;
114-
for (int num : nums) s.insert(num);
115-
while (s.count(original)) original <<= 1;
119+
unordered_set<int> s(nums.begin(), nums.end());
120+
while (s.contains(original)) {
121+
original <<= 1;
122+
}
116123
return original;
117124
}
118125
};
@@ -122,9 +129,9 @@ public:
122129
123130
```go
124131
func findFinalValue(nums []int, original int) int {
125-
s := make(map[int]bool)
126-
for _, num := range nums {
127-
s[num] = true
132+
s := map[int]bool{}
133+
for _, x := range nums {
134+
s[x] = true
128135
}
129136
for s[original] {
130137
original <<= 1
@@ -137,9 +144,9 @@ func findFinalValue(nums []int, original int) int {
137144

138145
```ts
139146
function findFinalValue(nums: number[], original: number): number {
140-
let set: Set<number> = new Set(nums);
141-
while (set.has(original)) {
142-
original *= 2;
147+
const s: Set<number> = new Set([...nums]);
148+
while (s.has(original)) {
149+
original <<= 1;
143150
}
144151
return original;
145152
}

solution/2100-2199/2154.Keep Multiplying Found Values by Two/README_EN.md

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,13 @@ tags:
6969

7070
<!-- solution:start -->
7171

72-
### Solution 1
72+
### Solution 1: Hash Table
73+
74+
We use a hash table $\textit{s}$ to record all the numbers in the array $\textit{nums}$.
75+
76+
Next, starting from $\textit{original}$, if $\textit{original}$ is in $\textit{s}$, we multiply $\textit{original}$ by $2$ until $\textit{original}$ is not in $\textit{s}$ anymore, then return $\textit{original}$.
77+
78+
The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is the length of the array $\textit{nums}$.
7379

7480
<!-- tabs:start -->
7581

@@ -108,9 +114,10 @@ class Solution {
108114
class Solution {
109115
public:
110116
int findFinalValue(vector<int>& nums, int original) {
111-
unordered_set<int> s;
112-
for (int num : nums) s.insert(num);
113-
while (s.count(original)) original <<= 1;
117+
unordered_set<int> s(nums.begin(), nums.end());
118+
while (s.contains(original)) {
119+
original <<= 1;
120+
}
114121
return original;
115122
}
116123
};
@@ -120,9 +127,9 @@ public:
120127
121128
```go
122129
func findFinalValue(nums []int, original int) int {
123-
s := make(map[int]bool)
124-
for _, num := range nums {
125-
s[num] = true
130+
s := map[int]bool{}
131+
for _, x := range nums {
132+
s[x] = true
126133
}
127134
for s[original] {
128135
original <<= 1
@@ -135,9 +142,9 @@ func findFinalValue(nums []int, original int) int {
135142

136143
```ts
137144
function findFinalValue(nums: number[], original: number): number {
138-
let set: Set<number> = new Set(nums);
139-
while (set.has(original)) {
140-
original *= 2;
145+
const s: Set<number> = new Set([...nums]);
146+
while (s.has(original)) {
147+
original <<= 1;
141148
}
142149
return original;
143150
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
class Solution {
22
public:
33
int findFinalValue(vector<int>& nums, int original) {
4-
unordered_set<int> s;
5-
for (int num : nums) s.insert(num);
6-
while (s.count(original)) original <<= 1;
4+
unordered_set<int> s(nums.begin(), nums.end());
5+
while (s.contains(original)) {
6+
original <<= 1;
7+
}
78
return original;
89
}
910
};

solution/2100-2199/2154.Keep Multiplying Found Values by Two/Solution.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
func findFinalValue(nums []int, original int) int {
2-
s := make(map[int]bool)
3-
for _, num := range nums {
4-
s[num] = true
2+
s := map[int]bool{}
3+
for _, x := range nums {
4+
s[x] = true
55
}
66
for s[original] {
77
original <<= 1
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function findFinalValue(nums: number[], original: number): number {
2-
let set: Set<number> = new Set(nums);
3-
while (set.has(original)) {
4-
original *= 2;
2+
const s: Set<number> = new Set([...nums]);
3+
while (s.has(original)) {
4+
original <<= 1;
55
}
66
return original;
77
}

solution/2100-2199/2155.All Divisions With the Highest Score of a Binary Array/README.md

Lines changed: 87 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,15 @@ tags:
8484

8585
<!-- solution:start -->
8686

87-
### 方法一
87+
### 方法一:前缀和
88+
89+
我们从 $i = 0$ 开始,用两个变量 $\textit{l0}$ 和 $\textit{r1}$ 分别记录 $i$ 左侧和右侧的 $1$ 的个数,初始时 $\textit{l0} = 0$,而 $\textit{r1} = \sum \textit{nums}$。
90+
91+
我们遍历数组 $\textit{nums}$,对于每个 $i$,更新 $\textit{l0}$ 和 $\textit{r1}$,计算当前分组得分 $t = \textit{l0} + \textit{r1}$,如果 $t$ 等于当前最大分组得分 $\textit{mx}$,则将 $i$ 加入答案数组,如果 $t$ 大于 $\textit{mx}$,则更新 $\textit{mx}$ 为 $t$,并将答案数组清空,然后将 $i$ 加入答案数组。
92+
93+
遍历结束后,返回答案数组。
94+
95+
时间复杂度 $O(n)$,其中 $n$ 为数组 $\textit{nums}$ 的长度。空间复杂度 $O(1)$。
8896

8997
<!-- tabs:start -->
9098

@@ -93,58 +101,45 @@ tags:
93101
```python
94102
class Solution:
95103
def maxScoreIndices(self, nums: List[int]) -> List[int]:
96-
left, right = 0, sum(nums)
97-
mx = right
104+
l0, r1 = 0, sum(nums)
105+
mx = r1
98106
ans = [0]
99-
for i, num in enumerate(nums):
100-
if num == 0:
101-
left += 1
102-
else:
103-
right -= 1
104-
t = left + right
107+
for i, x in enumerate(nums, 1):
108+
l0 += x ^ 1
109+
r1 -= x
110+
t = l0 + r1
105111
if mx == t:
106-
ans.append(i + 1)
112+
ans.append(i)
107113
elif mx < t:
108114
mx = t
109-
ans = [i + 1]
115+
ans = [i]
110116
return ans
111117
```
112118

113119
#### Java
114120

115121
```java
116122
class Solution {
117-
118123
public List<Integer> maxScoreIndices(int[] nums) {
119-
int left = 0, right = sum(nums);
120-
int mx = right;
124+
int l0 = 0, r1 = Arrays.stream(nums).sum();
125+
int mx = r1;
121126
List<Integer> ans = new ArrayList<>();
122127
ans.add(0);
123-
for (int i = 0; i < nums.length; ++i) {
124-
if (nums[i] == 0) {
125-
++left;
126-
} else {
127-
--right;
128-
}
129-
int t = left + right;
128+
for (int i = 1; i <= nums.length; ++i) {
129+
int x = nums[i - 1];
130+
l0 += x ^ 1;
131+
r1 -= x;
132+
int t = l0 + r1;
130133
if (mx == t) {
131-
ans.add(i + 1);
134+
ans.add(i);
132135
} else if (mx < t) {
133136
mx = t;
134137
ans.clear();
135-
ans.add(i + 1);
138+
ans.add(i);
136139
}
137140
}
138141
return ans;
139142
}
140-
141-
private int sum(int[] nums) {
142-
int s = 0;
143-
for (int num : nums) {
144-
s += num;
145-
}
146-
return s;
147-
}
148143
}
149144
```
150145

@@ -154,22 +149,19 @@ class Solution {
154149
class Solution {
155150
public:
156151
vector<int> maxScoreIndices(vector<int>& nums) {
157-
int left = 0, right = accumulate(nums.begin(), nums.end(), 0);
158-
int mx = right;
159-
vector<int> ans;
160-
ans.push_back(0);
161-
for (int i = 0; i < nums.size(); ++i) {
162-
if (nums[i] == 0)
163-
++left;
164-
else
165-
--right;
166-
int t = left + right;
167-
if (mx == t)
168-
ans.push_back(i + 1);
169-
else if (mx < t) {
152+
int l0 = 0, r1 = accumulate(nums.begin(), nums.end(), 0);
153+
int mx = r1;
154+
vector<int> ans = {0};
155+
for (int i = 1; i <= nums.size(); ++i) {
156+
int x = nums[i - 1];
157+
l0 += x ^ 1;
158+
r1 -= x;
159+
int t = l0 + r1;
160+
if (mx == t) {
161+
ans.push_back(i);
162+
} else if (mx < t) {
170163
mx = t;
171-
ans.clear();
172-
ans.push_back(i + 1);
164+
ans = {i};
173165
}
174166
}
175167
return ans;
@@ -181,19 +173,16 @@ public:
181173
182174
```go
183175
func maxScoreIndices(nums []int) []int {
184-
left, right := 0, 0
185-
for _, num := range nums {
186-
right += num
176+
l0, r1 := 0, 0
177+
for _, x := range nums {
178+
r1 += x
187179
}
188-
mx := right
180+
mx := r1
189181
ans := []int{0}
190-
for i, num := range nums {
191-
if num == 0 {
192-
left++
193-
} else {
194-
right--
195-
}
196-
t := left + right
182+
for i, x := range nums {
183+
l0 += x ^ 1
184+
r1 -= x
185+
t := l0 + r1
197186
if mx == t {
198187
ans = append(ans, i+1)
199188
} else if mx < t {
@@ -210,29 +199,54 @@ func maxScoreIndices(nums []int) []int {
210199
```ts
211200
function maxScoreIndices(nums: number[]): number[] {
212201
const n = nums.length;
213-
const total = nums.reduce((a, c) => a + c, 0);
214-
let left = 0,
215-
right = total;
216-
let record: Array<number> = [total];
217-
for (const num of nums) {
218-
if (num == 0) {
219-
left++;
220-
} else {
221-
right--;
222-
}
223-
record.push(left + right);
224-
}
225-
const max = Math.max(...record);
226-
let ans: Array<number> = [];
227-
for (let i = 0; i <= n; i++) {
228-
if (record[i] == max) {
202+
let [l0, r1] = [0, nums.reduce((a, b) => a + b, 0)];
203+
let mx = r1;
204+
const ans: number[] = [0];
205+
for (let i = 1; i <= n; ++i) {
206+
const x = nums[i - 1];
207+
l0 += x ^ 1;
208+
r1 -= x;
209+
const t = l0 + r1;
210+
if (mx === t) {
211+
ans.push(i);
212+
} else if (mx < t) {
213+
mx = t;
214+
ans.length = 0;
229215
ans.push(i);
230216
}
231217
}
232218
return ans;
233219
}
234220
```
235221

222+
#### Rust
223+
224+
```rust
225+
impl Solution {
226+
pub fn max_score_indices(nums: Vec<i32>) -> Vec<i32> {
227+
let mut l0 = 0;
228+
let mut r1: i32 = nums.iter().sum();
229+
let mut mx = r1;
230+
let mut ans = vec![0];
231+
232+
for i in 1..=nums.len() {
233+
let x = nums[i - 1];
234+
l0 += x ^ 1;
235+
r1 -= x;
236+
let t = l0 + r1;
237+
if mx == t {
238+
ans.push(i as i32);
239+
} else if mx < t {
240+
mx = t;
241+
ans = vec![i as i32];
242+
}
243+
}
244+
245+
ans
246+
}
247+
}
248+
```
249+
236250
<!-- tabs:end -->
237251

238252
<!-- solution:end -->

0 commit comments

Comments
 (0)