一般的做法(我自己也這樣做了哈哈)
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
O(n2)
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
這種方法利用了map的特性,不用雙重循環,降低了復雜度O(n)
這個更絕。。。既往前走,又往后回顧!!
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
hashCode是jdk根據對象的地址或者字符串或者數字算出來的int類型的數值
Map集合允許值對象為null,並且沒有個數限制,所以當get()方法的返回值為null時,可能有兩種情況,一種是在集合中沒有該鍵對象,另一種是該鍵對象沒有映射任何值對象,即值對象為null。因此,在Map集合中不應該利用get(Object key)方法來判斷是否存在某個鍵,而應該利用containsKey()方法來判斷,containsKey方法用來判斷Map集合對象中是否包含指定的鍵名。
語法 boolean containsKey(Object key)
返回值:如果Map集合中包含指定的鍵名,則返回true;否則返回false。
參數:key是要查詢的Map集合的鍵名對象。
get方法
同樣當key為null時會進行特殊處理,在table[0]的鏈表上查找key為null的元素
get的過程是先計算hash然后通過hash與table.length取摸計算index值,然后遍歷table[index]上的鏈表,直到找到key,然后返回