Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 472fab5

Browse files
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-
letset: Set<number> = new Set(nums);
3-
while (set.has(original)) {
4-
original *=2;
2+
consts: 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)

AltStyle によって変換されたページ (->オリジナル) /