1. 程式人生 > >領釦(LeetCode)兩個列表的最小索引總和 個人題解

領釦(LeetCode)兩個列表的最小索引總和 個人題解

假設Andy和Doris想在晚餐時選擇一家餐廳,並且他們都有一個表示最喜愛餐廳的列表,每個餐廳的名字用字串表示。

你需要幫助他們用最少的索引和找出他們共同喜愛的餐廳。 如果答案不止一個,則輸出所有答案並且不考慮順序。 你可以假設總是存在一個答案。

示例 1:

輸入:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
輸出: ["Shogun"]
解釋: 他們唯一共同喜愛的餐廳是“Shogun”。

示例 2:

輸入:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["KFC", "Shogun", "Burger King"]
輸出: ["Shogun"]
解釋: 他們共同喜愛且具有最小索引和的餐廳是“Shogun”,它有最小的索引和1(0+1)。

提示:

  1. 兩個列表的長度範圍都在 [1, 1000]內。
  2. 兩個列表中的字串的長度將在[1,30]的範圍內。
  3. 下標從0開始,到列表的長度減1。
  4. 兩個列表都沒有重複的元素。

拿到這個題,第一個想法就是覺得使用hashmap可以比較快的得到交集,只需要加上一定的判斷條件,找到最小索引和的那一項就能解決問題。事實證明可以實現。但是速度上不盡人意。

然後百度過後發現排名靠前的基本上是這個思路。那就這個做法吧 XD

不過注意這個題不能提前定義String[],因為不知道這個陣列的長度,必須使用List來轉換,這一點應該是題目設定不夠恰當導致的。不過java有內建方法轉換,也就沒關係了。

程式碼如下:

 1 class Solution {
 2     public String[] findRestaurant(String[] list1, String[] list2) {
 3         List<String> anslist=new LinkedList<>();
 4         Map<String, Integer> map=new
LinkedHashMap<>(); 5 int minmark=99999; 6 for (int i=0;i<list1.length;i++) 7 { 8 map.put(list1[i],i); 9 } 10 for (int i=0;i<list2.length;i++) 11 { 12 if(map.containsKey(list2[i])) 13 { 14 if((map.get(list2[i])+i)<minmark) 15 { 16 minmark=map.get(list2[i])+i; 17 anslist.clear(); 18 anslist.add(list2[i]); 19 } 20 else if((map.get(list2[i])+i)==minmark) 21 { 22 anslist.add(list2[i]); 23 } 24 } 25 } 26 return anslist.toArray(new String[anslist.size()]); 27 } 28 }