給定一個整數(shù)數(shù)組和一個目標值肚医,找出數(shù)組中和為目標值的兩個數(shù)。
你可以假設(shè)每個輸入只對應(yīng)一種答案向瓷,且同樣的元素不能被重復(fù)利用肠套。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
。
兩個思路:
1猖任、無腦雙循環(huán):直接循環(huán)每個數(shù)值對比一遍你稚。類似于冒泡。
時間復(fù)雜度O(n2)朱躺,空間復(fù)雜度O(1)
2刁赖、使用hashmap保存每個值與目標值的差值,這樣循環(huán)時根據(jù)map中是否有與當(dāng)前值相同的值长搀,即可得到兩數(shù)宇弛。
時間復(fù)雜度O(n),空間復(fù)雜度O(n)
第一種代碼實現(xiàn):
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
boolean flag = false;
for (int i = 0; i < nums.length - 1; i++) {
for (int j = i+1; j < nums.length; j++) {
if ((nums[i] + nums[j]) == target) {
result[0] = i;
result[1] = j;
flag = true;
break;
}
}
if (flag) {
break;
}
}
return result;
}
leetcode的執(zhí)行時間:55ms
第二種代碼實現(xiàn):
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
//余數(shù)map源请,key是每個數(shù)字與target相差的數(shù)值涯肩,value是這個數(shù)字的下標+1,因為題目要求的下標是從1開始的
Map<Integer, Integer> remainder = new HashMap<>(16);
for (int i = 0; i < nums.length; i++) {
//如果key有匹配的值巢钓,證明找到
if (remainder.containsKey(nums[i])) {
result[0] = i;
result[1] = remainder.get(nums[i]);
return result;
}
//不存在病苗,將這個值存入余數(shù)map中
remainder.put(target - nums[i], i);
}
return null;
}
leetcode執(zhí)行時間:8ms