LeetCode第一題以及時間複雜度的計算,leetcode計算
問題描述:給定一組指定整數數組,找出數組中加和等於特定數的兩個數。
函數(方法)twoSum返回這兩個數的索引,index1必須小於index2。
另外:你可以假設一個數組只有一組解。
一個栗子:
Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2
演算法實現如下:
1 /** 2 * 時間複雜度O(n) 3 * @param array 4 * @param target 5 * @return Map<Integer,Integer> 6 */ 7 public static Map<Integer, Integer> twoSum(int[] array, int target) { 8 9 //Map<value,index>10 Map<Integer, Integer> result = new HashMap<Integer, Integer>();11 12 Map<Integer, Integer> container = new HashMap<Integer, Integer>();13 for (int i = 0; i < array.length; i++) {14 if (!container.containsKey(target - array[i])) {15 container.put(array[i], i + 1);16 } else {17 result.put(target - array[i], container.get(target - array[i]));18 result.put(array[i], i + 1);19 break ;20 }21 }22 23 return result;24 }
另有雙層迴圈判斷的演算法實現,時間複雜度為O(n²),在此就不列出。
關於時間複雜度的計算
一個栗子:
1 int value = 0 ; //該代碼執行1次2 for(int i = 0 ; i < n ; i++){ 3 value += n ; //該代碼執行n次4 }
該演算法執行1+n次,如果n趨近於無窮大,1便可忽略不計,也就是說該演算法執行了n次。時間複雜度常用O符號表示,這個演算法的時間複雜度為O(n)。
當一個演算法的計算時間複雜度時,可以遵循這樣的規則:
1).去掉已耗用時間中的所有加法常數。
2).只保留最高階項。
3).如果最高階項存在且不是1,去掉與這個最高階相乘的常數得到時間複雜度
再一個栗子
1 for (int i = 0; i < n; i++) {2 for (int j = i; j < n; j++) {3 // do something4 }5 }
當 i = 0 時 裡面的fo迴圈執行了n次,當i等待1時裡面的for迴圈執行了n - 1次,當i 等於2裡裡面的fro執行了n - 2次........所以執行的次數是:
n + (n-1) + (n-2) + ...+ 1
= n(n+1)/2
= n²/2 + n/2
根據我們上邊的時間複雜度演算法
1.去掉已耗用時間中的所有加法常數: 沒有加法常數不用考慮
2.只保留最高階項: 只保留 n²/2
3. 去掉與這個最高階相乘的常數: 去掉 1/2 只剩下 n²
最終這個演算法的時間複雜度為O(n²)