Skip to content

Commit c8e6e68

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

25 files changed

+485
-371
lines changed

lcci/17.10.Find Majority Element/README.md

+65-52
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

+57-43
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)