上班摸魚刷題玩,剛好試試leetcode,第一題太簡單了
給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
然後我就直接暴力倆重for循環過了,然後看了一下題解發現官方題解裏的哈希表非常好,在查詢的時候不再使用for,而是改爲使用查找哈希表,這樣查找時間近似的就是O(1),倆重循環的一重直接變爲O(1)那麼整體的時間複雜度就變爲了O(n)。
試了下果然快了好多,從29ms變爲5ms,給我很大啓發,雖然這個題非常簡單,但以後遇到一些困難的問題時,通過合適的哈希能極大地達到以空間換時間的效果,這是一種不錯的思路。最後貼一下哈希的方式,雖然題解裏有
class Solution {
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 num = target-nums[i];
if(map.containsKey(num)&&map.get(num) != i){
return new int[] {i,map.get(num)};
}
}
return new int[] {0,0};
}
}