題目:給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。
最簡單,也最容易的就是double for循環,但是時間復雜度太高了,是O(n^2);
其實,思維變換一下,我們是要在數組中找一個num 和 target -num的值,那我們可以搞成兩個數組,第一個是原始數據nums1,第二個是target-num的數據nums2,這樣的話,就變成了怎么在nums2數組中找到和nums1中相同的數,比如nums1 = {1,3,5,7,9},target=6;nums2={5,3,1,-1,-3};可以明顯看出來,1,3,5在nums2中也存在,去除掉3(自身),就是1,5了。
那么怎么快速在nums2中找到是否存在和nums1中相同的值呢,使用Hash表。
代碼實現一:
- 先把nums數組中值和索引存到HashMap中
- 循環nums數組,查找是否存在target-num的key,同時找到的key不能是自身
- 輸出數組當前索引i,和找到值key對應的vlaue(目標索引)
import java.util.HashMap;
import java.util.Map;
public class twoSum {
public static void main(String[] args) {
int nums[] = {1,2,3,4,5};
int target = 6;
twoSum1(nums,target);
}
public static void twoSum1(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 temp = target-nums[i];
if(map.containsKey(temp) && map.get(temp)!=i){
System.out.println(i+"==="+ map.get(temp));
}
}
}
代碼實現二:
代碼實現一其實會有數據重復的問題,比如會出現{1,5} 和 {5,1},下面的實現二不僅避免了重復問題,還是只循環了nums一次,降低了時間復雜度,從O(2n)降到了O(n)
import java.util.HashMap;
import java.util.Map;
public class twoSum {
public static void main(String[] args) {
int nums[] = {1,2,3,4,5};
int target = 6;
twoSum2(nums,target);
}
public static void twoSum2(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int temp = target-nums[i];
if(map.containsKey(temp) && map.get(temp)!=i){
System.out.println(i+"==="+ map.get(temp));
}
map.put(nums[i],i);
}
}
}