題目相關
題目鏈接
LeetCode中國,https://leetcode-cn.com/problems/two-sum/。
題目描述
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
題目分析
LeetCode 給出本題難度簡單。
題意分析
在給定的數組中,找出一組數據,和正好爲 target。題目會保證只有一對答案。
樣例數據分析
基礎思路就是遍歷一下數組,建立一個哈希表。我們的樣例輸入簡單修改一下(如果不改,數據馬上就出來了),改爲 [2, 11, 15, 7],首先,我們建立一個哈希表 unordered_map<int, int> ans,第一個 int 存的是數組 nums 中的數據,第二個 int 存的是這個數據在數組 nums 的索引。
1、第一個數據爲 2,目標爲 9。因此 9-2=7,我們在 ans 中去查找有沒有數據 7 的索引。如果有,說明已經找到;如果沒有,也就我們可以建立 ans[2]=0。這個是什麼意思呢?就是數據 2 的位置是在數組的第 0 個位置。
2、第二個數據爲 11,目標爲 9。因此 9-11=-2,我們在 ans 中去查找有沒有數據 -2 的索引。如果有,說明已經找到;如果沒有,也就我們可以建立 ans[11]=1。這個是什麼意思呢?就是數據 11 的位置是在數組的第 1 個位置。
3、第三個數據爲 15,目標爲 9。因此 9-15=-6,我們在 ans 中去查找有沒有數據 -6 的索引。如果有,說明已經找到;如果沒有,也就我們可以建立 ans[15]=3。這個是什麼意思呢?就是數據 15 的位置是在數組的第 2 個位置。
4、第三個數據爲 7,目標爲 9。因此 9-7=2,我們在 ans 中去查找有沒有數據 2 的索引。這樣我們可以在 ans 中找到數據 2,所以輸出對應的數據就可以了。
算法設計
從上面的樣例數據分析過程,我們可以看出了,核心問題就是要建立起索引表。方法很簡單,就是遍歷 nums 數組即可。
AC 參考代碼
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> ans;//答案
//遍歷建立哈希表
for (int i=0; i<nums.size(); i++) {
if (ans.find(target-nums[i]) != ans.end()) {
//只會對應一個答案
return {ans[target-nums[i]], i};
}
ans[nums[i]] = i;
}
//沒有結果
return {};
}
};
暴力法
本題也可以使用暴力搜索。思路就不詳細寫了,就是兩個循環比對即可。
參考代碼
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int len=nums.size();
for(int i=0;i<len-1;i++) {
for(int j=i+1;j<len;j++) {
if (nums[i]+nums[j] == target) {
return {i,j};
}
}
}
return {};
}
};
經過測試,這個暴力竟然能通過。可能是 LeetCode 對本題定義爲簡單導致的。