LeetCode "Two Sum"
とりあえず一番上にあるやつから解いてみる。
問題文
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
与えられた数字列のうち2つを足して、目標の値にする。答えは1通りだけ。数字列内の要素の重複使用はダメ。
探索方法
単純に解こうとすると、1番目の要素を選び、2番目の要素を数列内から全探索する。要するに全探索。
計算量を減らすためには、ハッシュを使って探索時間を削減する。数列内の要素をハッシュのkey、その要素のインデックスをハッシュのvalueとする。最初にハッシュテーブルを作成しておいて、1番目の要素と足し合わせて目標値になる数字がハッシュテーブル内に存在するか?というのを、1番目の要素を変えながら調べていけば良い。
より効率的にするには、ハッシュテーブル作成をしながら、探索をする。具体的には、数列の要素を順に辿り、その要素と足し合わせて目標値になる要素がハッシュテーブル内に存在するかどうかを調べる。存在しなければ、その要素をハッシュテーブルに追加する。
コード
日本語で書いても分かりにくいので、submitしたコードはこちら。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ret = {};
std::unordered_map<int, int> um = {};
for(auto i = 0u; i < nums.size(); i++){
auto sub = target - nums[i];
if(um.find(sub) != um.end())
{
return {um[sub], i};
}
um[nums[i]] = i;
}
throw std::logic_error("cant resolve");
}
};