599. 两个列表的最小索引总和
查看原题
解题思路(暴力)
- 双重循环,遍历两个数组,
- 如果遇到两这都喜欢的餐厅,比较当前餐厅在两个数组中下标和,
- 如果下标和小于当前的最小下标和,则将原来的结果更新为空,再加入当前的餐厅,并更新最下的下标和;
- 如果小标和等于当前的最下标和,则也将餐厅加入结果中
代码
/**
* @param {string[]} list1
* @param {string[]} list2
* @return {string[]}
*/
var findRestaurant = function(list1, list2) {
const length1 = list1.length;
const length2 = list2.length;
let minIndex = length2 + length1;
let str = []
for(let i = 0;i < length1;i++) {
for(let j =0 ;j < length2; j++){
if(list1[i] === list2[j]){
let temp = i + j;
if((i + j) < minIndex) {
minIndex = i+j;
str = [list1[i]]
}else if((i + j) === minIndex){
str.push(list2[j]);
}
}
}
}
return str;
};
解题思路(哈希)
使用一个哈希表记录 list1中每个餐厅对应的索引下标,然后遍历 list2
,如果 list2中的餐厅存在于哈希表中,那么说明该餐厅是两人共同喜爱的,计算它的索引和。如果该索引和比最小索引和小,则清空结果,将该餐厅加入结果中,该索引和作为最小索引和;如果该索引和等于最小索引和,则直接将该餐厅加入结果中。
代码
/**
* @param {string[]} list1
* @param {string[]} list2
* @return {string[]}
*/
var findRestaurant = function(list1, list2) {
const map = new Map();
for(let i = 0;i < list1.length; i++) {
map.set(list1[i],i);
}
let result = [];
let minIndex = 200000;
for(let j = 0; j< list2.length ;j++) {
if(map.has(list2[j])) {
const i = map.get(list2[j]);
if((i + j) < minIndex) {
result.length = 0;
result.push(list2[j]);
minIndex = i + j;
}else if((i + j) === minIndex) {
result.push(list2[j])
}
}
}
return result;
};