1. 程式人生 > >two sum(LeetCode)

two sum(LeetCode)

該題目是leetcode上一道非常簡單但是經典的題,現把該題的較為經典的解題思路進行總結

1 題目描述

該題的輸入是給定一個數組,以及一個目標值,通過計算找出陣列中兩個元素和等於目標值的各自的索引。

如下例子所示:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

2 python解題思路

 1 class Solution(object):
 2     def twoSum(self, nums, target):
 3         if
len(nums) <= 1: 4 return False 5 buff_dict = {} #建立一個空字典 6 for i in range(len(nums)): #迴圈查詢nums陣列中的每一個元素 7 if nums[i] in buff_dict: #判斷該元素是否在字典中,如果在字典中,進入該分支 8 return [buff_dict[nums[i]], i] #將該鍵(nums[i])在字典中的值以及該值在nums陣列中的索引返回作為最終結果
9 else: 10 buff_dict[target - nums[i]] = i #如果陣列中該索引的值不在字典中,那麼將該目標值(也就是輸入的和targrt)減去該值作為字典中的一個鍵,把該值的索引作為鍵對應的值儲存

這種解題思路的巧妙之處就在於一次迴圈就可以完成搜尋,時間複雜度是O(n)

原因是首先通過索引迴圈陣列中的每個值,假如該值不在字典中,那麼儲存的是目標值與該值的差,以及該值在陣列中索引,在之後的搜尋中是判斷陣列中每個值是否在字典中,額就是是否正好等於這個差,如果等於,那麼說明這兩個數的和正好就是目標值,如果字典中不存在該值,那麼同樣將該值和目標值的插值存於陣列中,就是是更新了字典。

每次的迴圈判斷都是去查詢陣列中之前的所有元素與目標值的差,這是該解題方式的巧妙之處。

該題用到了python中的字典,也就是Java或者C++中的hash表,在python中的基本使用如下所示:

字典是另一種可變容器模型,且可儲存任意型別物件。

字典的每個鍵值 key=>value 對用冒號 : 分割,每個鍵值對之間用逗號 , 分割,整個字典包括在花括號 {} 中 ,格式如下所示:

1 d = {key1 : value1, key2 : value2 }

3 java解題思路

將python的解題思路用Java實現如下所示:

 1 class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         Map<Integer, Integer> map = new HashMap<>();
 4     for (int i = 0; i < nums.length; i++) {
 5         int complement = target - nums[i];
 6         //map.put(complement, i);      
 7         if (map.containsKey(nums[i])) {
 8             return new int[] { map.get(nums[i]), i};
 9         }
10         else {
11             map.put(complement, i); 
12         }
13     }
14     throw new IllegalArgumentException("No two sum solution");
15     }
16 }