1. 程式人生 > 其它 >1.兩數之和_簡單_20210122

1.兩數之和_簡單_20210122

技術標籤:9.每日一練演算法

目錄

1.兩數之和

1.1.題目描述

1.2.解法一:暴力迴圈

1.3.解法二:雜湊表


1.兩數之和

1.1.題目描述

  • 給定一個整數陣列nums和一個整數目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回它們的陣列下標。
  • 你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。

1.2.解法一:暴力迴圈

  • 兩重迴圈,遍歷所有情況看相加是否等於目標和。
  • 時間複雜度:兩層 for 迴圈,O(n²)
  • 空間複雜度:O(1)
public int[] twoSum(int[] nums, int target) {
        int[] ans=new int[2];
        for(int i=0;i<nums.length;i++){
            for(int j=(i+1);j<nums.length;j++){
                if(nums[i]+nums[j]==target){
                    ans[0]=i;
                    ans[1]=j;
                }
            }
        }
        return ans;
    }

1.3.解法二:雜湊表

  • 使用Map集合以鍵值對形式儲存陣列元素及對應下標
  • 檢視Map中是否存在(target-nums[i])的鍵,還需判斷找到的元素不是當前元素,因為題目裡講一個元素只能用一次。
  • 時間複雜度:比解法一少了一個 for 迴圈,降為 O(n)
  • 空間複雜度:空間換時間, 開闢了一個雜湊表,空間複雜度變為 O(n)
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 sub=target-nums[i];
        if(map.containsKey(sub)&&map.get(sub)!=i){
            return new int[]{i,map.get(sub)};
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}