zoukankan      html  css  js  c++  java
  • LeetCode 1: Two Sum

    题目描述:

    Given an array of integers, find two numbers such that they add up to a specific target number.

    The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

    You may assume that each input would have exactly one solution.

    Input: numbers={2, 7, 11, 15}, target=9
    Output: index1=1, index2=2

    思考:

    1.首先没注意审题,以为数组是排序的,然后就用两个指针,一前一后,直到找到目标和的指针

        vector<int> twoSum(vector<int> &numbers, int target) {
            int start = 0;
            int tail = numbers.size()-1;
            vector<int> result;
            while(start<tail){
                if(numbers[start] + numbers[tail] <target){
                    start ++;
                }else if(numbers[start] + numbers[tail] > target){
                    tail --;
                }else{
                    result.push_back(start);
                    result.push_back(tail);
                    return result;
                }
            }
        }
    

      提交后,发现Runtime Error

    2.然后考虑的是暴力的方法,时间复杂度为O(n^2)

        vector<int> twoSum(vector<int> &numbers, int target) {
            vector<int> result;
            for(int i =0;i<numbers.size(); i++){
                for(int j=i+1;j<numbers.size(); j++){
                    if(numbers[i] + numbers[j] == target){
                        result.push_back(i+1);
                        result.push_back(j+1);
                        return result;
                    }
                }
            }
        }
    

      

    发现Time Limit Exceeded。

    3.遂寻找更快速的方法,网上参考了下,发现需要HashTable,使用STL的map来实现。

        vector<int> twoSum(vector<int> &numbers, int target) {
            vector<int> result;
            map<int,int> map_res;
            for(int i =0;i<numbers.size();i++){
                int temp = target - numbers[i];
                if(map_res[temp]){
                    result.push_back(map_res[temp]+1);
                    result.push_back(i+1);
                }
                map_res[numbers[i]]=i;
            }
            return result;
        }
    

    4.发现结果还是不对,Runtime Error,错误的例子是[0,4,3,0], 0,发现原来在取map_res[0]的值对应的是0,改了下方法,使用map_res.count(temp),终于AC了

        vector<int> twoSum(vector<int> &numbers, int target) {
            vector<int> result;
            map<int,int> map_res;
            for(int i =0;i<numbers.size();i++){
                int temp = target - numbers[i];
                if(map_res.count(temp)){
                    result.push_back(map_res[temp]+1);
                    result.push_back(i+1);
                }
                map_res[numbers[i]]=i;
            }
            return result;
        }
    

      

  • 相关阅读:
    DataTablez转List对象效率慢的问题.
    Oracle 删除重复数据
    1.layui 添加旋转等待, 2.div里面加载HTML页面
    layui-table JSON.stringify()序列化出来的不同行数据类型错误.导致后台转成表格的时候出错.(常用)
    0基础学MVC课程
    构造函数的执行顺序
    html控件自动点 “加号”添加 多个附件
    C#委托之个人理解 转自 loose_went
    一步一步学Linq to sql系列文章 转lovecherry
    使用AOP 使C#代码更清晰 转yanghua_kobe
  • 原文地址:https://www.cnblogs.com/xiamaogeng/p/4351012.html
Copyright © 2011-2022 走看看