题目:来源于力扣
分析:
看完题目后,我最先想到的是用哈希表,但是我在准备一场机试,机试的编译环境不能使用哈希表。
所以我又想到了暴力求解(●ˇ∀ˇ●)
**思路:**两个for循环,外层控制 list1,内层控制 list2,把 两个vector容器中相同字符串 索引之和 的 最小值求出。然后再用两个for循环找到和该最小值相同的 字符串下标,之后存入vector容器中
中间有想到过用 set_intersection求两个容器的交集,但是使用 set_intersection 要求两个容器的数据是有序排列的。这题的索引是固定的,不能改,因此不适用。
好了,话不多说,看看代码吧!
class Solution {
public:
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
//哎呀,还是得暴力求解吗?
vector<string> vTarget; //返回值
int min_index = 2001;
for (int i = 0; i < list1.size(); ++i) {
for (int j = 0; j < list2.size(); ++j) {
if (list1[i] == list2[j]) {
min_index = min(min_index, i + j);
}
}
}
for (int i = 0; i < list1.size(); ++i) {
for (int j = 0; j < list2.size(); ++j) {
if (i + j == min_index && list1[i] == list2[j]) {
vTarget.emplace_back(list1[i]);
}
}
}
return vTarget;
}
};
接下来,再用哈希表实现一下吧!
clear()函数用于清空容器,之前听过,不怎么用,现在就当知道了
class Solution {
public:
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
vector<string> vTarget; //返回值
int min_index = 2001;
map<string, int> m;
//将list1的字符串放入map中
for (int i = 0; i < list1.size(); ++i) {
m.insert(make_pair(list1[i],i));
}
//找list2中 在map中已有的字符串,找到list2中的下标
//计算i+j,和min_index比较
//如果i+j 小于 min_index,说明该索引之和还不是最小,清空容器,把索引之和最小的字符串放入
for (int i = 0; i < list2.size(); ++i) {
//如果在list2找到 和 map 中的字符串配对
if (m.count(list2[i]) > 0) {
int j = m[list2[i]];
if (i + j < min_index) {
vTarget.clear();
vTarget.emplace_back(list2[i]);
min_index = i + j;
}
else if(i+j == min_index) {
vTarget.emplace_back(list2[i]);
}
}
}
return vTarget;
}
};
今天还剩4道题,加油啊!
( •̀ ω •́ )✧