兩數之和
1.題目描述
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
2.思路
2.1.暴力法,時間複雜度爲 0(n^2)
從第一個數字開始,依次與後續數組求和,查看是否與目標值相等,,線上執行效率,時間 <30%,空間<5%,結果較差。
public int[] twoSum(int[] nums, int target) {
int[] result = {0,0};
for(int i=0;i<nums.length;i++){
for(int j = i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target)
{
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
2.2 利用hashMap,時間複雜度爲 O(N).
思路,將每個元素與目標值的差值,也就是補數,存在表中,一次循環。如果hashMap中存在這個key,說明前面的遍歷過程已經存過,那麼就去找存它的下標就行了。簡直聰明!
public int[] twoSum(int[] nums, int target) {
int[] result = {0,0};
HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
for(int i = 0; i < nums.length; i++){
if(hash.containsKey(nums[i])){
result[0] = i;
result[1] = hash.get(nums[i]);
return result;
}
// 將數據存入 key爲補數 ,value爲下標
hash.put(target-nums[i],i);
}
return result;