LC 599. Minimum Index Sum of Two Lists
题目描述
Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite restaurants represented by strings.
You need to help them find out their common interest with the least list index sum. If there is a choice tie between answers, output all of them with no order requirement. You could assume there always exists an answer.
Example 1:
Input: ["Shogun", "Tapioca Express", "Burger King", "KFC"] ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"] Output: ["Shogun"] Explanation: The only restaurant they both like is "Shogun".
Example 2:
Input: ["Shogun", "Tapioca Express", "Burger King", "KFC"] ["KFC", "Shogun", "Burger King"] Output: ["Shogun"] Explanation: The restaurant they both like and have the least index sum is "Shogun" with index sum 1 (0+1).
参考答案
1 class Solution { 2 public: 3 vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) { 4 5 vector<string> res; 6 unordered_map<string, int> map; 7 for(size_t i = 0 ; i< list1.size(); i++) 8 map[list1[i]] = i ; // list1 = key ; i = value ; 9 10 size_t min = INT_MAX; 11 12 for(size_t i = 0 ; i<list2.size();i ++){ 13 auto iter = map.find(list2[i]); 14 if(iter != map.end()){ 15 if(iter->second + i< min ){ 16 min = map[list2[i]] + i; 17 res.assign(1,list2[i]); // 直接把值赋给第一个,不需要clear然后重新赋值 18 19 }else if(iter->second + i == min){ 20 res.push_back(list2[i]); 21 } 22 23 } 24 } 25 return res; 26 } 27 };
分析备注
1. for 循环中,int 替换为 size_t 可以加速。
2. vector.assign(1,value) 可以实现 清除+赋值 两步操作。
3. 使用 iter -> first 和 iter -> second 可以更快。