###### tags: `Array` <h1>Leetcode 1. Two Sum</h1> <ol> <li>問題描述</li> Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target. <br> <br> You may assume that each input would have exactly one solution, and you may not use the same element twice. You can return the answer in any order. <br> <br> Only one valid answer exists. <br> <br> Example 1 Input: nums = [2,7,11,15], target = 9 Output: [0,1] Explanation: Because nums[0] + nums[1] == 9, we return [0, 1]. Example 2 Input: nums = [3,2,4], target = 6 Output: [1,2] Example 3 Input: nums = [3,3], target = 6 Output: [0,1] <li>Input的限制</li> <ul> <li>2 <= nums.length <= 10^4</li> <li>-10^9 <= nums[i] <= 10^9</li> <li>-10^9 <= target <= 10^9</li> </ul> <br> <li>思考流程</li> <ul> <li>暴力解</li> 利用第一個 for loop 來固定住 array element, A,再利用第二個 for loop 遍歷整個 array,找尋有沒有 array element, B 與 A 相加後可以等於 target 值。如果有就回傳 A 和 B 的索引值。 <br> <br> 這裡要注意的是,要避免自己相加自己為 target 的情況。 <br> <br> Time Complexity: O(n^2); Space Complexity: O(1) <br> <br> <li>Hashmap</li> 需要額外準備一個 hashmap( 以 Python 為例就是 dictionary 結構 )來儲存資訊。遍歷整個 array( 從索引值為 0 開始 ),儲存每一個當前的 array element 為 key,其索引值為 value。在遍歷的時候,同時檢查 hashmap 內是否存在 target - array[i] 的 key。若存在即找到相加為 target 的兩個元素,回傳其索引值;若不存在則繼續遍歷剩下的 array elements。 <br> <br> Time Complexity: O(n); Space Complexity: O(n) <br> <br> <li>排序法</li> 首先對 array elements 進行排序。對於排序好的 array,利用左右兩個指標從 array 的頭尾開始遍歷,如果相加小於 target 就讓左指標往右移動,相加大於 target 就讓右指標往左移動。當發現兩個 array elements 相加等於 target 時,即回傳他們的索引值。 <br> <br> Time Complexity: O(nlogn); Space Complexity: O(1) ~ O(n) <br> <br> </ul> <li>測試</li> <ul> <li>test 1</li> Input: nums = [1, 5, 4, 3, 9], target = 13 Output: [2, 4] <li>test 2( worst case case for hashmap )</li> Input: nums = [1, 3, 5, 6], target = 11 Output: [2, 3] <li>array elements less than two( edge case )</li> 如果不計 array 的大小,空陣列或是只有一個元素的陣列,就會造成演算法無法處理的情況,需要例外處理。 <li>some array elements are not numbers( edge case )</li> 如果沒有規範 input 一定要是數字,出現字串類的的 input 則需要另外處理。 </ul> </ol>