初日
整数の配列nums
とターゲット値が与えられた場合、配列内のtarget
2つの整数のターゲット値を計算し、それらの配列の添え字に戻ります。
各入力は1つの回答にのみ対応すると想定できます。ただし、配列内の同じ要素を2回使用することはできません。
例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
c ++
これが高い評価の問題解決策であり、その間違いは修正されました
暴力法:
配列内の同じ要素を2回使用することはできないため、同様の[2,2,3,4],target=6
状況はありません。
しかし[2,5,3,4],target=7
、ケースを除外しないでください、そうすればデフォルトは最初の答えに戻ることを探しています
上記の2つの問題について考えた後、解決策について考え始めます
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 {
};
};
};
概要:方法は単純ですが、時間計算量はO(n 2)です。スペースの複雑さは、O(1)の
実行速度が遅く、メモリスペースの消費量が多いことです。
2パスハッシュテーブル:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;//建立hash表存放数组元素
vector<int> b(2,-1);//存放结果
for(int i=0;i<nums.size();i++)
a.insert(map<int,int>::value_type(nums[i],i));
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0&&(a[target-nums[i]]!=i))
//判断是否找到目标元素且目标元素不能是本身
{
b[0]=i;
b[1]=a[target-nums[i]];
break;
}
}
return b;
};
};
ハッシュテーブル
改善:要素を繰り返してテーブルに挿入するときに、戻って、現在の要素に対応するターゲット要素がテーブルにすでに存在するかどうかも確認します。存在する場合は、対応する解決策を見つけてすぐに返します。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;//提供一对一的hash
vector<int> b(2,-1);//用来承载结果,初始化一个大小为2,值为-1的容器b
for(int i=0;i<nums.size();i++)
{
if(a.count(target-nums[i])>0)
{
b[0]=a[target-nums[i]];
b[1]=i;
break;
}
a[nums[i]]=i;//反过来放入map中,用来获取结果下标
}
return b;
};
};