两数之和(NC61/考察次数Top8/难度简单)

描述:
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2

示例1
输入:
[3,2,4],6
复制
返回值:
[2,3]
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 
     * @param numbers int整型vector 
     * @param target int整型 
     * @return int整型vector
     */
    vector<int> twoSum(vector<int>& numbers, int target) {
           //方法1,暴力遍历法
//         vector<int> results = {0,0};
//         for(int i=0; i<numbers.size()-1; i++)         //和排序算法的选择法类似,暴力遍历
//         {
//             for(int j=i+1; j<numbers.size(); j++)
//             {
//                 if(numbers[i]+numbers[j]==target)
//                 {
//                     results[0] = i+1;                 //返回的是下标值的index,注意和i的区别
//                     results[1] = j+1;                 
//                     return results;
//                 }
//             }
//         }
//         throw invalid_argument("no two sum solution"); //没有结果则抛异常
        
        
        //方法2,hash table,快速地映射数据和它的下标
        vector<int> results = {0,0};
        map<int, int> hashtable;                          //定义一个hashtable的map
        //完成hashtable的填充(值,index)
        for(int i=0;i<numbers.size();i++)                 //遍历所有元素生成hashtable
        {
            hashtable[numbers[i]]=i;                      //定义hashtable,分别为"值,index"
        }
        
        for(int i =0; i<numbers.size(); i++)
        {
            int temp = target - numbers[i];                           //求出需要找到的对应值
            //注意hashtable.count(目标值)和hashtable.at(目标值的index)的使用
            if(hashtable.count(temp) != 0 && hashtable.at(temp) != i) //找到了(temp对应的count
            {                                                   //不为0),而且temp对应的不是本身
                results = {i+1, hashtable.at(temp)+1};               //找到了,对result进行赋值
                return results;
            }
        }
        throw invalid_argument("No two sum solution");                //异常情况,需要抛异常
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

上一篇:2021-07-18 6


下一篇:167. 两数之和 II - 输入有序数组