两个列表的最小索引总和
难度:简单
通过map记录较短数组的元素和下标,再遍历另外一个数组找到与map中相匹配的元素,需比较索引和:
- 若当前索引和小于最小索引和,则清除res数组的内容,更新最小索引值,并记录当前元素。
- 若当前索引和等于最小索引和,则记录当前元素。
代码如下:
public String[] findRestaurant(String[] list1, String[] list2) {
//保证list1总是较短的数组
if (list1.length>list2.length){
return findRestaurant(list2,list1);
}
//遍历list1,将元素和索引下标记录到map中
Map<String,Integer> map = new HashMap<>();
for (int i = 0; i < list1.length; i++) {
map.put(list1[i],i);
}
List<String> res = new ArrayList<>();
int min = Integer.MAX_VALUE;
for (int i = 0; i < list2.length; i++) {
String temp = list2[i];
//当两数组出现相同元素时
if (map.containsKey(temp)){
//若当前索引和小于最小索引和,则清除res数组的内容,更新最小索引值,并记录当前元素。
if (i+map.get(temp)<min){
min = i+map.get(temp);
res.clear();
res.add(temp);
}
//若当前索引和等于最小索引和,则记录当前元素。
else if (i+map.get(temp)==min){
res.add(temp);
}
}
}
return res.toArray(new String[res.size()]);
}
执行结果:成功