[Java]1.兩數之和 - LeetCode

1 題目

<div align=center> <img src="https://img2018.cnblogs.com/blog/1173617/201910/1173617-20191006021559422-1117932709.png"> </div>算法

2 思路與代碼

  • 思路一:暴力法(兩層For循環)
    • 時間複雜度:O(n^2)
      • 對於每一個元素,咱們試圖經過遍歷數組的其他部分來尋找它所對應的目標元素,這將耗費 O(n) 的時間。所以時間複雜度爲 O(n^2)。
    • 空間複雜度:O(1)
    • 原理:遍歷每一個元素 xx,並查找是否存在一個值與 target - x相等的目標元素
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target){
    static int result[2]= {0};
    for(int i=0;i<numsSize;i=i++){
        for(int j=i+1;j<numsSize;j=j++){ //【trick】「int j=i+1;」而非「int j=0」
            if(nums[i]+nums[j]==target){
                result[0] = i;
                result[1] = j;
                return result;
            }
        }
    }
    return result;
}
  • 思路二:兩遍哈希表
    • 時間複雜度:O(n)
      • 把包含有 n 個元素的列表遍歷兩次。因爲哈希表將查找時間縮短到 O(1) ,因此時間複雜度爲O(n)
    • 空間複雜度:O(n)
      • 所需的額外空間取決於哈希表中存儲的元素數量,該表中存儲了 n 個元素

<div align=center> <img src="https://img2018.cnblogs.com/blog/1173617/201910/1173617-20191006022927420-505285184.png"> </div>數組

class Solution {
    /*
     思路:兩遍哈希表
     推薦文獻:
        https://baijiahao.baidu.com/s?id=1628609734622761569&wfr=spider&for=pc
    */
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap();
        for(int i=0;i<nums.length;i++){
            map.put(nums[i],i);
        }
        for(int j=0;j<nums.length;j++){
            int tmp = target - nums[j];
            if(map.containsKey(tmp) && map.get(tmp)!=j){
                return new int [] { j, map.get(tmp) };
            }
        }
        throw new IllegalArgumentException("No two sum solution!");
    }
}
  • 思路三:一遍哈希表
    • 時間複雜度:O(n)
      • 只遍歷了包含有n 個元素的列表一次。在表中進行的每次查找只花費 O(1) 的時間
    • 空間複雜度:O(n)
      • 所需的額外空間取決於哈希表中存儲的元素數量,該表最多須要存儲 n 個元素。
    • 原理:經過思路二,能夠推得:上述過程能夠一次完成。在進行迭代並將元素插入到表中的同時,咱們還會回過頭來檢查表中是否已經存在當前元素所對應的目標元素。若是它存在,那咱們已經找到了對應解,並當即將其返回。
class Solution {//一次Hash查表
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap();
        for(int i=0;i<nums.length;i++){
            int tmp = target - nums[i];
            if(map.containsKey(tmp) && map.get(tmp)!=i){
                return new int [] { i, map.get(tmp) };
            } else {
                map.put(nums[i],i);
            }
        }
        // for(int j=0;j<nums.length;j++){
        //     int tmp = target - nums[j];
        //     if(map.containsKey(tmp) && map.get(tmp)!=j){
        //         return new int [] { j, map.get(tmp) };
        //     }
        // }
        throw new IllegalArgumentException("No two sum solution!");
    }
}

<div align=center> <img src="https://img2018.cnblogs.com/blog/1173617/201910/1173617-20191006124050490-767477915.png"> </div>數據結構

3 參考文獻

4 博文遺留問題

  • (數據結構/Java中)HashMap/哈希表 查詢的原理與實現?
相關文章
相關標籤/搜索