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 c8e6e68

Browse files
committed
feat: update solutions to lc/lcci/lcof problems
1 parent 0a89f1e commit c8e6e68

File tree

25 files changed

+485
-371
lines changed

25 files changed

+485
-371
lines changed

‎lcci/17.10.Find Majority Element/README.md‎

Lines changed: 65 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,19 @@
3535

3636
<!-- 这里可写通用的实现逻辑 -->
3737

38-
摩尔投票法。时间复杂度 O(n),空间复杂度 O(1)。
38+
**方法一:摩尔投票法**
3939

40-
一般而言,摩尔投票法需要对输入的列表进行**两次遍历**。在第一次遍历中,我们生成候选值 candidate,如果存在多数,那么该候选值就是多数值。在第二次遍历中,只需要简单地计算候选值的频率,以确认是否是多数值。
40+
摩尔投票法的基本步骤如下:
4141

42-
接下来我们详细看下**第一次遍历**:
42+
初始化元素 $m,ドル并给计数器 $cnt$ 赋初值 $cnt=0$。对于输入列表中每一个元素 $x$:
4343

44-
我们需要两个变量:`cnt`, `candidate`,其中 `cnt` 初始化为 0,`candidate` 初始化可以是任何值,这里我们设置为 0。
44+
1. 若 $cnt=0,ドル那么 $m=x$ and $cnt=1$;
45+
1. 否则若 $m=x,ドル那么 $cnt=cnt+1$;
46+
1. 否则 $cnt=cnt-1$。
4547

46-
对于列表中的每个元素 num,我们首先检查计数值 cnt,
48+
一般而言,摩尔投票法需要对输入的列表进行**两次遍历**。在第一次遍历中,我们生成候选值 $m,ドル如果存在多数,那么该候选值就是多数值。在第二次遍历中,只需要简单地计算候选值的频率,以确认是否是多数值。
4749

48-
-`cnt == 0`,我们将候选值 candidate 设置为当前元素值,即 `candidate = num`
49-
-`candidate == num`,将 cnt 加 1,否则减 1。
50-
51-
**第二次遍历**,则是扫描列表中 candidate 出现的次数,若大于 `n/2`,则该候选值就是多数值,否则返回 -1。
50+
时间复杂度 $O(n),ドル空间复杂度 $O(1)$。
5251

5352
<!-- tabs:start -->
5453

@@ -59,12 +58,13 @@
5958
```python
6059
class Solution:
6160
def majorityElement(self, nums: List[int]) -> int:
62-
cnt = candidate = 0
63-
for num in nums:
61+
cnt = m = 0
62+
for v in nums:
6463
if cnt == 0:
65-
candidate = num
66-
cnt += (1 if candidate == num else -1)
67-
return candidate if nums.count(candidate) > len(nums) / 2 else -1
64+
m, cnt = v, 1
65+
else:
66+
cnt += (1 if m == v else -1)
67+
return m if nums.count(m) > len(nums) // 2 else -1
6868
```
6969

7070
### **Java**
@@ -74,20 +74,22 @@ class Solution:
7474
```java
7575
class Solution {
7676
public int majorityElement(int[] nums) {
77-
int cnt = 0, candidate = 0;
78-
for (int num : nums) {
77+
int cnt = 0, m = 0;
78+
for (int v : nums) {
7979
if (cnt == 0) {
80-
candidate = num;
80+
m = v;
81+
cnt = 1;
82+
} else {
83+
cnt += (m == v ? 1 : -1);
8184
}
82-
cnt += (num == candidate ? 1 : -1);
8385
}
8486
cnt = 0;
85-
for (int num : nums) {
86-
if (num == candidate) {
87+
for (int v : nums) {
88+
if (m == v) {
8789
++cnt;
8890
}
8991
}
90-
return cnt > nums.length / 2 ? candidate : -1;
92+
return cnt > nums.length / 2 ? m : -1;
9193
}
9294
}
9395
```
@@ -100,21 +102,23 @@ class Solution {
100102
* @return {number}
101103
*/
102104
var majorityElement = function (nums) {
103-
let cnt = 0;
104-
let candidate = 0;
105-
for (const num of nums) {
105+
let cnt = 0,
106+
m = 0;
107+
for (const v of nums) {
106108
if (cnt == 0) {
107-
candidate = num;
109+
m = v;
110+
cnt = 1;
111+
} else {
112+
cnt += m == v ? 1 : -1;
108113
}
109-
cnt += candidate == num ? 1 : -1;
110114
}
111115
cnt = 0;
112-
for (const num of nums) {
113-
if (candidate == num) {
116+
for (const v of nums) {
117+
if (m == v) {
114118
++cnt;
115119
}
116120
}
117-
return cnt > nums.length / 2 ? candidate : -1;
121+
return cnt > nums.length / 2 ? m : -1;
118122
};
119123
```
120124

@@ -124,14 +128,18 @@ var majorityElement = function (nums) {
124128
class Solution {
125129
public:
126130
int majorityElement(vector<int>& nums) {
127-
int cnt = 0, candidate = 0;
128-
for (int num : nums)
131+
int cnt = 0, m = 0;
132+
for (int& v : nums)
129133
{
130-
if (cnt == 0) candidate = num;
131-
cnt += (candidate == num ? 1 : -1);
134+
if (cnt == 0)
135+
{
136+
m = v;
137+
cnt = 1;
138+
}
139+
else cnt += (m == v ? 1 : -1);
132140
}
133-
cnt = count(nums.begin(), nums.end(), candidate);
134-
return cnt > nums.size() / 2 ? candidate : -1;
141+
cnt = count(nums.begin(), nums.end(), m);
142+
return cnt > nums.size() / 2 ? m : -1;
135143
}
136144
};
137145
```
@@ -140,25 +148,26 @@ public:
140148
141149
```go
142150
func majorityElement(nums []int) int {
143-
var cnt, candidate int
144-
for _, num := range nums {
151+
cnt, m := 0, 0
152+
for _, v := range nums {
145153
if cnt == 0 {
146-
candidate = num
147-
}
148-
if candidate == num {
149-
cnt++
154+
m, cnt = v, 1
150155
} else {
151-
cnt--
156+
if m == v {
157+
cnt++
158+
} else {
159+
cnt--
160+
}
152161
}
153162
}
154163
cnt = 0
155-
for _, num := range nums {
156-
if candidate == num {
164+
for _, v := range nums {
165+
if m == v {
157166
cnt++
158167
}
159168
}
160169
if cnt > len(nums)/2 {
161-
return candidate
170+
return m
162171
}
163172
return -1
164173
}
@@ -169,24 +178,28 @@ func majorityElement(nums []int) int {
169178
```cs
170179
public class Solution {
171180
public int MajorityElement(int[] nums) {
172-
int cnt = 0, candidate = 0;
173-
foreach (int num in nums)
181+
int cnt = 0, m = 0;
182+
foreach (int v in nums)
174183
{
175184
if (cnt == 0)
176185
{
177-
candidate = num;
186+
m = v;
187+
cnt = 1;
188+
}
189+
else
190+
{
191+
cnt += m == v ? 1 : -1;
178192
}
179-
cnt += (candidate == num ? 1 : -1);
180193
}
181194
cnt = 0;
182-
foreach (int num in nums)
195+
foreach (int v in nums)
183196
{
184-
if (candidate == num)
197+
if (m == v)
185198
{
186199
++cnt;
187200
}
188201
}
189-
return cnt > nums.Length / 2 ? candidate : -1;
202+
return cnt > nums.Length / 2 ? m : -1;
190203
}
191204
}
192205
```

‎lcci/17.10.Find Majority Element/README_EN.md‎

Lines changed: 57 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -47,33 +47,36 @@ Boyer–Moore majority vote algorithm
4747
```python
4848
class Solution:
4949
def majorityElement(self, nums: List[int]) -> int:
50-
cnt = candidate = 0
51-
for num in nums:
50+
cnt = m = 0
51+
for v in nums:
5252
if cnt == 0:
53-
candidate = num
54-
cnt += (1 if candidate == num else -1)
55-
return candidate if nums.count(candidate) > len(nums) / 2 else -1
53+
m, cnt = v, 1
54+
else:
55+
cnt += (1 if m == v else -1)
56+
return m if nums.count(m) > len(nums) // 2 else -1
5657
```
5758

5859
### **Java**
5960

6061
```java
6162
class Solution {
6263
public int majorityElement(int[] nums) {
63-
int cnt = 0, candidate = 0;
64-
for (int num : nums) {
64+
int cnt = 0, m = 0;
65+
for (int v : nums) {
6566
if (cnt == 0) {
66-
candidate = num;
67+
m = v;
68+
cnt = 1;
69+
} else {
70+
cnt += (m == v ? 1 : -1);
6771
}
68-
cnt += (num == candidate ? 1 : -1);
6972
}
7073
cnt = 0;
71-
for (int num : nums) {
72-
if (num == candidate) {
74+
for (int v : nums) {
75+
if (m == v) {
7376
++cnt;
7477
}
7578
}
76-
return cnt > nums.length / 2 ? candidate : -1;
79+
return cnt > nums.length / 2 ? m : -1;
7780
}
7881
}
7982
```
@@ -86,21 +89,23 @@ class Solution {
8689
* @return {number}
8790
*/
8891
var majorityElement = function (nums) {
89-
let cnt = 0;
90-
let candidate = 0;
91-
for (const num of nums) {
92+
let cnt = 0,
93+
m = 0;
94+
for (const v of nums) {
9295
if (cnt == 0) {
93-
candidate = num;
96+
m = v;
97+
cnt = 1;
98+
} else {
99+
cnt += m == v ? 1 : -1;
94100
}
95-
cnt += candidate == num ? 1 : -1;
96101
}
97102
cnt = 0;
98-
for (const num of nums) {
99-
if (candidate == num) {
103+
for (const v of nums) {
104+
if (m == v) {
100105
++cnt;
101106
}
102107
}
103-
return cnt > nums.length / 2 ? candidate : -1;
108+
return cnt > nums.length / 2 ? m : -1;
104109
};
105110
```
106111

@@ -110,14 +115,18 @@ var majorityElement = function (nums) {
110115
class Solution {
111116
public:
112117
int majorityElement(vector<int>& nums) {
113-
int cnt = 0, candidate = 0;
114-
for (int num : nums)
118+
int cnt = 0, m = 0;
119+
for (int& v : nums)
115120
{
116-
if (cnt == 0) candidate = num;
117-
cnt += (candidate == num ? 1 : -1);
121+
if (cnt == 0)
122+
{
123+
m = v;
124+
cnt = 1;
125+
}
126+
else cnt += (m == v ? 1 : -1);
118127
}
119-
cnt = count(nums.begin(), nums.end(), candidate);
120-
return cnt > nums.size() / 2 ? candidate : -1;
128+
cnt = count(nums.begin(), nums.end(), m);
129+
return cnt > nums.size() / 2 ? m : -1;
121130
}
122131
};
123132
```
@@ -126,25 +135,26 @@ public:
126135
127136
```go
128137
func majorityElement(nums []int) int {
129-
var cnt, candidate int
130-
for _, num := range nums {
138+
cnt, m := 0, 0
139+
for _, v := range nums {
131140
if cnt == 0 {
132-
candidate = num
133-
}
134-
if candidate == num {
135-
cnt++
141+
m, cnt = v, 1
136142
} else {
137-
cnt--
143+
if m == v {
144+
cnt++
145+
} else {
146+
cnt--
147+
}
138148
}
139149
}
140150
cnt = 0
141-
for _, num := range nums {
142-
if candidate == num {
151+
for _, v := range nums {
152+
if m == v {
143153
cnt++
144154
}
145155
}
146156
if cnt > len(nums)/2 {
147-
return candidate
157+
return m
148158
}
149159
return -1
150160
}
@@ -155,24 +165,28 @@ func majorityElement(nums []int) int {
155165
```cs
156166
public class Solution {
157167
public int MajorityElement(int[] nums) {
158-
int cnt = 0, candidate = 0;
159-
foreach (int num in nums)
168+
int cnt = 0, m = 0;
169+
foreach (int v in nums)
160170
{
161171
if (cnt == 0)
162172
{
163-
candidate = num;
173+
m = v;
174+
cnt = 1;
175+
}
176+
else
177+
{
178+
cnt += m == v ? 1 : -1;
164179
}
165-
cnt += (candidate == num ? 1 : -1);
166180
}
167181
cnt = 0;
168-
foreach (int num in nums)
182+
foreach (int v in nums)
169183
{
170-
if (candidate == num)
184+
if (m == v)
171185
{
172186
++cnt;
173187
}
174188
}
175-
return cnt > nums.Length / 2 ? candidate : -1;
189+
return cnt > nums.Length / 2 ? m : -1;
176190
}
177191
}
178192
```

0 commit comments

Comments
(0)

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