LeetCode乙個簡單的演算法 兩個陣列元素求和

2021-09-24 04:53:40 字數 1526 閱讀 1180

讓自己經常做些演算法訓練, 目前在leetcode上面找easy型別的做起, 俗話說柿子要挑軟的捏嘛.

乙個非常簡單的題目:

幸虧下面有example說明, 不然我以為用陣列中兩個元素的index相加, 尷尬⊙﹏⊙‖∣

二話不說, 直接上雙層for迴圈:

public int twosum(int nums, int target) ;}}

}throw new illegalargumentexception("no two sum solution");

}

嗯, 說到最後面一行拋異常, 我最開始是return null, 要善用異常處理, 後面我會專門花一塊時間學一下.

看了答案, 我的解法被歸類於暴力法(brute force), 有點兒尷尬. 說實話, 雖然很久沒寫**, 但是我其實覺得我的變成思想是有所提公升的.

瞄了一下第二個解法----two-pass hash table

public int twosummap(int nums, int target)

for(int i = 0; i < nums.length; i ++);}}

throw new illegalargumentexception("no two sum solution");

}

原來是用了hash map進行兩次遍歷, 豁然開朗, 第一次遍歷將陣列中所有的元素和下標, 以key:value的形式組裝成map, 元素是key, 下標是value.

在此遍歷陣列時, 用target - nums[i] 的值去map中判斷, true時成功.

兩個對比一下, 第二種方法最多只是完整的遍歷2次, 但是第一種方法會隨著陣列元素數量的增多, 而使執行時間的增長遠超於第二種方法.

這裡關於時間複雜度方面就不寫了, 因為不懂, 出差不方便, 等回家要啃《演算法》

另外第三種解法就更效率了-------one-pass hash table

public int twosummaponefor(int nums, int target);

}map.put(nums[i], i);

}throw new illegalargumentexception("no two sum solution");

}

可以看出這段**非常高效, 一次遍歷就搞定, 並且因為實在if語句結束後才執行map的put方法, 所以不需要判斷是否為同乙個陣列元素, 因為當前元素還沒進入map中.

總結一下, 後兩種方法一看就明白, 說明並沒有超出自己的能力或技術範圍, 說明自己需要提公升自己的經驗並多做相關的訓練和學習. 另外就是自己以前寫**的時候, map用的少, 所以沒有第一時間想到它. 還有就是這個題目太簡單了, 寫文字的時間遠大於寫**加思考的時間, 價效比太低, 以後這種簡單的題目我就簡單總結.

乙個簡單的迷宮演算法

迷宮問題的求解是乙個典型的問題,那仫如何找到迷宮的出口?在遇到死胡同的時候如何返回?如何防止走重複的路程?這就是我們要解決的問題了.要列印乙個簡單的迷宮,我們理所當然的想到了利用二維陣列,在迷宮的實現中我定義了乙個mazemap.txt的檔案用來儲存迷宮,在初始化的時候只需要將該迷宮從mazemap...

乙個簡單的洗牌演算法

首先我們需要寫乙個 生成指定區間內的隨機數 的函式 因為陣列索引都是整數,所以我們需要對隨機的結果再向下取整 返回乙個 min,max 之間的隨機數 function getrandomint min,max math.random 會生成乙個 0,1 之間的number 然後我們需要遍歷陣列,對每...

乙個簡單的大數乘法演算法

include using namespace std const int n 1000 自定義大數的長度,可以根據需要調整 void longmulti char str1,char str2 int i,j int str1 lenght strlen str1 int str2 lenght ...