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 something
4     }
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²)


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM