【例題】給定一個整數數組nums 和一個目標值 target,請在該數組中找出和為目標值的那兩個整數,並返回他們的數組下標。
*可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
看到題的第一眼想到的便是暴力解法,代碼如下:
public static Object[] test1(int[] nums,int num){
long t1 = System.currentTimeMillis();
for(int i = 0; i < nums.length; i++){
for(int j = i+1; j < nums.length; j++){
if(nums[j] + nums[i] == num){
long t2 = System.currentTimeMillis();
long t3 = t2 - t1;
//返回兩個數組下標及所用時間
return new Object[]{i,j,t3};
}
}
}
long t2 = System.currentTimeMillis();
return new Object[]{"No sulution",t2-t1};
}
時間復雜度為O(n^2),空間復雜度為O(1)。
當數據量小於一萬時,運行沒有任何卡頓,但當處理大數據量時,速度明顯變慢,於是就采用hashmap的方式比較了一下:
public static Object[] test2(int[] nums, int num) {
//時間戳
long t1 = System.currentTimeMillis();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int tmp = num - nums[i];
//判斷map中是否包含鍵名tmp
if (map.containsKey(tmp)) {
long t2 = System.currentTimeMillis();
//返回兩個數組下標及所用時間
return new Object[] { i, map.get(tmp), t2-t1 };
}
map.put(nums[i], i);
}
long t2 = System.currentTimeMillis();
return new Object[]{"No sulution",t2-t1};
}
時間復雜度為O(n),空間復雜度為O(n)。
數量小時,暴力解法與hashmap方式效率差不多,但當處理大數據時,使用containsKey方法會大大降低消耗。
