1. 程式人生 > 實用技巧 >leetcode-兩數之和(雜湊表降低時間複雜度)

leetcode-兩數之和(雜湊表降低時間複雜度)

題目描述: 給定一個整數陣列 nums和一個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。 你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
心得體會:拿到本題,毫無思路,看看提示,用暴力解決法實現了;但是想不到其他的優化方法,再根據提示,使用雜湊表用空間換取時間,降低時間複雜度,學習到了,而且時間確實減少了不少。以下程式碼為證:
package priv.tzk.array;

import java.util.Arrays; import java.util.HashMap; /* 題目:兩數之和 題幹:給定一個整數陣列 nums和一個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。 你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。 */ public class TwoSum { public static void main(String[] args) { int[] nums={2,10,7,11,15}; int target=9; // 記錄程式執行時間
long start=System.nanoTime(); //獲取開始時間,納秒 System.out.println(Arrays.toString(twoSum1(nums,target))); long end=System.nanoTime(); //獲取結束時間 System.out.println("程式1空間複雜度O(1),時間複雜度O(n^2),執行時間: "+(end-start)+"納秒"); System.out.println("-----------------------------------------------------------------------------------");
// 記錄程式執行時間 long start2=System.nanoTime(); //獲取開始時間,納秒 int ret[]=twoSum1(nums,target); System.out.println(Arrays.toString(ret)); long end2=System.nanoTime(); //獲取結束時間 System.out.println("程式2空間複雜度O(n),時間複雜度O(n),執行時間: "+(end2-start2)+"納秒"); } // 思路1:一個真正暴力的方法是搜尋所有可能的數字對,但這太慢了。同樣,為了完整性,最好嘗試暴力解決方案。正是從這些暴力解決方案中,您可以提出優化。 // 所以,如果我們確定其中一個數字x,我們必須掃描整個陣列才能找到下一個數字y=value-x,其中value是輸入引數。 public static int[] twoSum1(int[] nums, int target) { int[] ret=new int[2]; for (int i=0;i<nums.length;i++) { int x = nums[i]; if(x<target){ int y = target - nums[i]; for(int j=i;j<nums.length;j++){ if(nums[j]==y){ ret= new int[]{i, j}; } } } } return ret; } // 思路2:在不改變陣列的情況下,我們是否可以使用額外的空間?比如一個雜湊表來加速搜尋? // 使用雜湊表,可以將尋找 target - x 的時間複雜度從 O(N) 降低到 O(1) public static int[] twoSum2(int[] nums, int target){ int[] ret=new int[2]; HashMap<Integer, Integer> map = new HashMap<>(); for (int i=0;i<nums.length;i++) { int x = nums[i]; if(x<target){ map.put(nums[i], i);//新增資料 int y = target - nums[i]; // 使用雜湊表降低時間複雜度 if(map.containsKey(y)){//查詢雜湊表中是否存在key為y ret= new int[]{i, map.get(y)}; } } } return ret; } }

執行時間,對比截圖:

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/two-sum
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。