育碧遊戲《工人物語》開啟內測,最新預告片公佈
阿新 • • 發佈:2022-01-17
Data structure
Array
1. 兩數之和
date:22.2.22
Quesion
給定一個整數陣列 nums 和一個整數目標值 target,請你在該陣列中找出 和為目標值 target 的那 兩個 整數,並返回它們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素在答案裡不能重複出現。
你可以按任意順序返回答案。
Example
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6
輸出:[0,1]
Hint
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只會存在一個有效答案
進階:你可以想出一個時間複雜度小於 O(n2) 的演算法嗎?
AC code1
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i, j; for(i = 0; i < nums.size()-1; i++){ for(j = i + 1; j < nums.size(); j++){ if (nums[i] + nums[j] == target){ return {i, j}; } } } return {}; /* no answer should return null */ }; };
- 暴力匹配就可以了,注意
j
的變化在i
之後。但O(n)
為O(n^2)
,太慢了。 - knowlegle:
size()
返回一個vector得長度
AC code2
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { /* array map element to index */ map<int, int> array_element_index; /* answer has two index */ vector<int> answer(2, 0); for (int i = 0; i < nums.size(); i++) array_element_index.insert(map<int, int>::value_type(nums[i], i)); for (int i = 0; i< nums.size(); i++){ /* use count() find the element and can't be itself */ if(array_element_index.count(target - nums[i]) && (array_element_index[target - nums[i]] != i)){ answer[0] = i; answer[1] = array_element_index[target - nums[i]]; break; } } return answer; }; };
-
使用hash表,將原來的
nums
反過來對映一遍,沒錯,我們恰好是將陣列中的元素(element)和索引(index)反過來了,在array_element_index
中key是element,value是index -
使用
count()
能非常巧妙的找出匹配的element,但注意不能是本身- 例如
nums = [3, 2, 4], target = 6
,如果是本身的話3+3 = 6
,顯然不符合題意
- 例如
-
knowlegle
vector<int> answer(2, 0);
是建立一個有兩個初始數值為0的vectorcount()
是計算某個key出現的次數,如果沒找到就返回0