題目
給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。
Two Sum 問題分步教程
步驟 1:理解問題
首先,我們需要理解題目的要求。對于 Two Sum 問題,題目要求在給定的整數數組中找到兩個整數,使它們的和等于目標值。我們需要返回這兩個整數的數組下標。
步驟 2:分析問題
在分析問題時,我們可以考慮不同的解決方案。對于 Two Sum 問題,一種簡單直觀的方法是使用兩層循環遍歷所有可能的組合,找到和等于目標值的那一對。然而,這樣的解法時間復雜度較高(O(n^2)),不是最優解。更高效的方法是使用哈希表。
步驟 3:選擇數據結構
為了提高解決問題的效率,我們選擇使用哈希表來存儲已經遍歷過的數字及其對應的下標。這樣可以在 O(1) 的時間內查找數字是否存在于數組中。
步驟 4:算法設計
- 創建一個空的哈希表(Map 或對象)numberIndexMap,用于存儲已經遍歷過的數字及其對應的下標。
- 遍歷數組 nums。
- 對于每個數字 nums[i],計算其補數 complement,即 target - nums[i]。
- 檢查補數是否已經在哈希表中存在。
如果存在,說明找到了兩個數的和等于目標值,直接返回它們的下標。
如果不存在,將當前數字及其下標存入哈希表中。
如果遍歷完整個數組都沒有找到符合條件的兩個數,返回一個空數組。
步驟 5:實現算法
根據上述算法設計,我們可以用 TypeScript 編寫代碼實現 Two Sum 問題的解決方案。
/**
* 在給定的整數數組中找到兩個整數,使它們的和等于目標值。
* @param {number[]} nums - 整數數組
* @param {number} target - 目標值
* @returns {number[]} 包含兩個整數的數組,它們的和等于目標值的下標
*/
function twoSum(nums: number[], target: number): number[] {
// 創建一個哈希表,用于存儲已經遍歷過的數字及其對應的下標
const numberIndexMap: Record<number, number> = {};
// 遍歷數組
for (let i = 0; i < nums.length; i++) {
// 計算當前數字的補數
const complement = target - nums[i];
// 檢查補數是否已經在哈希表中存在
if (complement in numberIndexMap) {
// 如果存在,直接返回包含兩個數字下標的數組
return [numberIndexMap[complement], i];
}
// 如果不存在,將當前數字及其下標存入哈希表中
numberIndexMap[nums[i]] = i;
}
// 如果沒有找到符合條件的兩個數字,返回一個空數組
return [];
}
// 示例
const nums = [3, 2, 4];
const target = 6;
// 調用函數,獲取結果并輸出
const result = twoSum(nums, target);
console.log(result);
步驟 6:測試和調試
在實現完算法后,我們需要進行測試和調試,確保代碼能夠正確運行。可以通過給定的示例和其他測試用例進行驗證。
步驟 7:復雜度分析
最后,我們對算法的時間復雜度進行分析。在這個算法中,哈希表的插入和查找操作的平均時間復雜度是 O(1),因此整體算法的時間復雜度是 O(n)。
通過以上步驟,我們完成了 Two Sum 問題的分析、設計和實現。希望這個教程能夠幫助你更好地理解算法問題的解決過程。