91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python怎么實現兩個列表的最小索引總和

發布時間:2021-11-20 11:16:16 來源:億速云 閱讀:121 作者:iii 欄目:編程語言

這篇文章主要講解了“Python怎么實現兩個列表的最小索引總和”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python怎么實現兩個列表的最小索引總和”吧!

題目:

假設 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. 兩個列表都沒有重復的元素。

解題思路:

兩個字符串數組,找重復出現的元素,返回其索引和最小的目標數組。最容易想到的解法就是用哈希映射解題,Key 存儲其數組的每個元素值,Value 存儲其下標索引。第一次遍歷將其中一個數組添加到哈希映射,第二次遍歷查找目標元素。需要維護一個最小索引和來保證查詢的目標索引和為最小。

哈希表解題:

Java:

class Solution {
 public String[] findRestaurant(String[] list1, String[] list2) {
 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 sum = Integer.MAX_VALUE;//sum為當前滿足條件的最小索引和
 for (int i = 0; i < list2.length; i++) {//第二次遍歷查找目標元素
 if (map.containsKey(list2[i])) {
 int tmp = i + map.get(list2[i]);//當前索引和
 if (tmp < sum) {//如果當前索引和更小
 res.clear();//清除目標數組
 res.add(list2[i]);//添加該元素
 sum = tmp;// 刷新最小索引和
 } else if (tmp == sum)//如果索引和相等
 res.add(list2[i]);//只添加元素
 }
 }
 return res.toArray(new String[res.size()]);//轉成 string 數組
 }
}

Python:

class Solution:
 def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
 hash_map = dict()# 建立哈希映射
 for i, s in enumerate(list1):# 初次遍歷將一個數組建立映射關系
 hash_map[s] = i
 min_sum = 2001# 當前滿足條件的最小索引和
 res = list()# 待返回的目標數組
 for i, s in enumerate(list2):# 第二次枚舉遍歷查找目標元素
 if s in hash_map:
 tmp = i+hash_map[s]# 當前索引和
 if tmp < min_sum:# 如果當前索引和更小
 res.clear()# 清除目標數組
 res.append(s)# 添加該元素
 min_sum = tmp# 刷新最小索引和
 elif tmp == min_sum:# 如果索引和相等
 res.append(s)# 只添加元素
 return res

操作索引解題:

這種解法非常巧妙,雖然效率很低。以下解釋摘自 LeetCode,可以作為參考擴展思路:

另一種可以遍歷不同 sumsum (下標和),并判斷是否有字符串分別出現在 list1 和 list2 中且下標和為 sum。

現在我們知道下標和的值 sum 數值范圍從 0 到 m + n - 1。這里 m 和 n 分別是 list1 和 list2 的長度,我們現在可以升序枚舉 sum ,對于每個 sum,我們遍歷 list1,假設當前下標為 i,為了得到下標和 sum,list2 中的下標 j 為 sum?i。通過這樣的辦法,我們不需要遍歷 list2,而可以直接通過計算得到在 list2 中對應的下標。

對于每個 sum,我們遍歷 list1 的所有下標,一旦有 list1 和 list2 中的字符串匹配,就把匹配字符串放入一個 res 列表中。

我們對 sum 升序數組中所有值做相同的過程,對于每個 sum 遍歷完一遍 list1 之后,我們檢查 res 列表是否為空。如果是空的,我們繼續遍歷下一個 sum 數組。如果不為空,當前的 res 就是最小下標和的數組。這是因為我們遍歷 sum 的順序是升序的,所以第一個找到的列表就是結果列表。

Java:

class Solution {
 public String[] findRestaurant(String[] list1, String[] list2) {
 List<String> res = new ArrayList<>();
 for (int sum = 0; sum < list1.length + list2.length - 1; sum++) {
 for (int i = 0; i <= sum; i++) {
 if (i < list1.length && sum - i < list2.length && list1[i].equals(list2[sum - i]))
 res.add(list1[i]);
 }
 if (res.size() > 0) break;//一旦找到最小索引和序列直接結束遍歷,因為sum是遞增的,之后得到的索引和一定更大
 }
 return res.toArray(new String[res.size()]);
 }
}

Python

class Solution:
 def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
 res = list()
 list1_size, list2_size = len(list1), len(list2)
 for min_sum in range(list1_size+list2_size-1):
 for i in range(min_sum+1):
 if i < list1_size and min_sum-i < list2_size and list1[i] == list2[min_sum-i]:
 res.append(list1[i])
 if len(res) > 0:# 一旦找到最小索引和序列直接結束遍歷,因為sum是遞增的,之后得到的索引和一定更大
 break
 return res

感謝各位的閱讀,以上就是“Python怎么實現兩個列表的最小索引總和”的內容了,經過本文的學習后,相信大家對Python怎么實現兩個列表的最小索引總和這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

郎溪县| 长阳| 吐鲁番市| 宿迁市| 盱眙县| 保德县| 延长县| 望城县| 南昌县| 凤翔县| 竹山县| 渭南市| 阿荣旗| 宣城市| 临清市| 蒙自县| 米泉市| 建瓯市| 临沭县| 崇左市| 阳春市| 江口县| 叙永县| 惠水县| 桐梓县| 华蓥市| 沂水县| 浮梁县| 曲沃县| 桃园县| 西充县| 潜山县| 平山县| 织金县| 临江市| 视频| 竹溪县| 行唐县| 江北区| 宝清县| 丽江市|