LeetCode熱題1:Two Sum

題目:給定一個整數數組 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表。

代碼實現一:
  1. 先把nums數組中值和索引存到HashMap中
  2. 循環nums數組,查找是否存在target-num的key,同時找到的key不能是自身
  3. 輸出數組當前索引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);
        }
    }
    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容