国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

about Two Sum of leetcode (HashMap)

2019-11-06 06:06:21
字體:
來源:轉載
供稿:網友

作個人記錄LeetCode解題過程中的一些啟發之用。

Two Sum

Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.

給出一個int型數組,和一個目標(和)target,返回數組中和為target的兩int型數組元素的下標 實現上述功能。 Example:

Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].

這是一個很簡單的題目,很容易實現,不過算法的時間復雜度值得考究。 開始隨手寫的方法如下,java實現:

public class Solution { public int[] twoSum(int[] nums, int target) { int[] a = new int[2]; for(int i = 0; i < nums.length; i++){ for(int j = i+1; j<nums.length; j++){ if(nums[j] == target - nums[i]){ a[0]=i; a[1]=j; } } } return a; }}

上面的算法時間復雜度為O(n2),雖然accepted,顯然不理想

得票數第一的Java實現,時間復雜度為O(n):

public int[] twoSum(int[] numbers, int target) { int[] result = new int[2]; Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i = 0; i < numbers.length; i++) { if (map.containsKey(target - numbers[i])) { result[1] = i + 1; result[0] = map.get(target - numbers[i]); return result; } map.put(numbers[i], i + 1); } return result;}

這里用了HashMap數據結構,Java中HashMap的containsKey、get、put方法時間復雜度為O(1)(在HashMap中的存儲的entry對的Key的哈希不相等時,即不發生碰撞情況)

與上面第一種算法的兩層for循環相比,這種算法只需要遍歷nums[]數組一次,將其以(nums[] , index)鍵值對存進HashMap。并且是先移動下標i,再判斷containsKey(),再將其put進HashMap,再移動下標,在前面生成的HashMap中進行containsKey判斷

Key:

這種在靠后點判斷之前點的方法與第一種暴力檢索的在靠前點遍歷之后點的思路是完全相反的,這也是由HashMap的通過hashcode()來search的性質決定的,對于nums[]規模較大時,HashMap的效率要遠優于兩層遍歷方法。

此外還有Python實現的版本

class Solution(object): def twoSum(self, nums, target): if len(nums) <= 1: return False buff_dict = {} for i in range(len(nums)): if nums[i] in buff_dict: return [buff_dict[nums[i]], i] else: buff_dict[target - nums[i]] = i

同樣時間復雜度為O(n),這里采用的是python里的dict字典數據結構。遍歷nums[],先判斷nums[i],再將target-nums[i]存進dict,直到在nums[]中遍歷到在dict中存儲過的元素。


總結

無論是Java還是Python實現,都是基于使用一種search時間復雜度低(O(1))的數據結構來存儲數組nums[],因為數組nums[]的search只能基于遍歷這種暴力方法,時間復雜度為O(n)。因此以后在涉及到search的問題時應當選擇時間復雜度更優的HashMap之類的數據結構。

about HashMap :

HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。HashMap 繼承于AbstractMap,實現了Map、Cloneable、java.io.Serializable接口。HashMap 的實現不是同步的,這意味著它不是線程安全的。它的key、value都可以為null。此外,HashMap中的映射不是有序的。HashMap 的實例有兩個參數影響其性能:“初始容量” 和 “加載因子”。容量 是哈希表中桶的數量,初始容量 只是哈希表在創建時的容量。加載因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。 HashMap 's Methods


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昭通市| 柞水县| 横峰县| 东至县| 电白县| 德格县| 阳高县| 潢川县| 肇东市| 卫辉市| 石棉县| 剑川县| 鹤山市| 西林县| 吉木萨尔县| 会同县| 正蓝旗| 南陵县| 靖江市| 丰原市| 阿坝县| 汪清县| 上思县| 射阳县| 碌曲县| 新余市| 应城市| 巴塘县| 普安县| 哈巴河县| 兴化市| 大田县| 磐安县| 化德县| 潞西市| 古交市| 安图县| 建德市| 开封市| 武威市| 商都县|