题目:来源于力扣

分析:
看完题目后,我最先想到的是用哈希表,但是我在准备一场机试,机试的编译环境不能使用哈希表。
所以我又想到了暴力求解(●ˇ∀ˇ●)
**思路:**两个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道题,加油啊!
( •̀ ω •́ )✧
这篇博客介绍了如何在不允许使用哈希表的机试环境中,通过暴力求解的方法寻找两个字符串列表中相同元素的最小索引和。作者首先使用两个嵌套循环找到最小索引和,然后再次遍历找到对应字符串。接着,作者展示了使用哈希表优化解决方案的过程,通过映射列表1的字符串到其索引,然后遍历列表2,查找匹配项并更新最小索引和。最后,返回所有具有最小索引和的字符串。
1320

被折叠的 条评论
为什么被折叠?



