2つの数値の1日目の合計

初日

2つの数値の合計

整数の配列numsとターゲット値が与えられた場合、配列内のtarget2つの整数のターゲット値を計算し、それらの配列の添え字に戻ります。

各入力は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;
    };
};

おすすめ

転載: blog.csdn.net/qq_44082148/article/details/111937084