1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
int FindMostIds(vector<int> &ids)
{
map<int,int> hashIds;
map<int,int>::iterator it;
hashIds.clear();
for (int i = 0; i < ids.size(); i++)
{
it = hashIds.find(ids[i]);
if (hashIds.end() == it)
{
hashIds.insert(map<int,int>::value_type(ids[i],1));
}
else
{
it->second++;
}
}
int id = 0, count = -1;
for (it = hashIds.begin(); it != hashIds.end(); it++)
{
if (it->second > count)
{
id = it->first;
count = it->second;
}
}
return id;
}
|
这个题1:可以继续优化;2:如果是出现3个发帖水王,每个人超过四分之一的帖子,该题如何解?今天晚了,先回宿舍,明日再解,其实我已经想到方法了。
问题1:
编程之美的书上说,可以在空间复杂度上优化到O(1)
看书之后得到提示:
用一个id来存当前id
count来存id的计数,然后比较是否相等,动态维护,最终的id一定是水王。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
int FindMostIds(vector<int> &ids)
{
if (ids.size() <= 0)
return -1;
int id = ids[0];
int count = 1;
for (vector<int>::size_type i = 1; i < ids.size(); i++)
{
if (0 == count)
{
id = ids[i];
count = 1;
continue;
}
if (id == ids[i])
{
count++;
}
else
{
count--;
}
}
return id;
}
|
问题2: 可以用问题1解法2的推广:[自己想的,没有经过严格测试,目测思想正确]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
void FindMostIds(vector<int> &ids)
{
if (ids.size() <= 0)
return ;
int id[3] = {-1, -1, -1};
int count[3] = {0, 0, 0};
for (vector<int>::size_type i = 1; i < ids.size(); i++)
{
bool flag = false;
for (int j = 0; j < 3; j++)
{
if (id[j] == ids[i])
{
count[j]++;
flag = true;
break;
}
}
if (flag) continue;
flag = false;
for (int j = 0; j < 3; j++)
{
if (count[j] == 0)
{
id[j] = ids[i];
count[j]++;
flag = true;
break;
}
}
if (flag) continue;
for (int j = 0; j < 3; j++)
{
count[j]--;
}
}
for (int i = 0; i < 3; i++)
{
cout << id[i] << '\t';
}
cout << endl;
}
|