一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
1.描述
假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。
示例 1:
输入: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
输出: ["Shogun"]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。
示例 2:
输入:list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["KFC", "Shogun", "Burger King"]
输出: ["Shogun"]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。
提示:
- 1 <= list1.length, list2.length <= 1000
- 1 <= list1[i].length, list2[i].length <= 30
- list1[i] 和 list2[i] 由空格 ' ' 和英文字母组成。
- list1 的所有字符串都是 唯一 的。
- list2 中的所有字符串都是 唯一 的。
2.分析
利用变量min_index_sum记录当前的的最小索引和
对于Andy的每一餐厅,遍历Doris的列表,查找是否存在该餐厅,不存在继续Andy的下一个餐厅,否则:
- 当前索引和大于当前的记录,则忽略该餐厅
- 当前的索引和小于当前的记录,则更新当前最小索引和记录,并清空结果数组,将当前餐厅加入
- 当前索引和等于记录,则将当前餐厅加入结果数组
优化
可以使用哈希map记录Andy的餐厅和对应的下标
然后遍历Doris的列表中的每一元素,如果元素存在于哈希map中,则进行暴力中同样的操作方法
3.AC代码
class Solution {
public:
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
//建立符号表
unordered_map<string, int> st;
for (int i = 0; i < list1.size(); ++i) {
st[list1[i]] = i;
}
//遍历并更新
int min_index_sum = INT_MAX;
vector<string> ans;
for (int i = 0; i < list2.size(); ++i) {
if (st.count(list2[i])) {
int index_sum = i + st[list2[i]];
if (index_sum > min_index_sum) { //如果下标差过大,则直接忽略
continue;
}
if (index_sum < min_index_sum) { //如果下标差更小
min_index_sum = index_sum;
ans.clear();
}
ans.push_back(list2[i]); //下标差小于等于当前记录都要将该餐厅添加到结果数组
}
}
return ans;
}
};