• [LeetCode_1] twoSum


    LeetCode: 1. twoSum

    cpp

    题目描述

    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.
    Example:

    Given nums = [2, 7, 11, 15], target = 9,
    
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].
    

    中文:

    说的就是给出一个整形数组nums,和一个整数target;返回两个数字的角标,这两个角标对应在数组中的数字加起来等于target。
    你可以假设每种输入只有一个正确答案。

    思路

    暴力穷举的话就是使用2重循环,对每两个数字进行求和,然后当和为target的时候,返回这两个数。这种方法的时间复杂度也是显而易见的,为O(N^2),这种方法的时间损耗过大,不能接受。

    另外一个思路就是利用哈希表,使用一个哈希表,然后对数组进行一重循环就可以了:对数组中的每个数计算c = target - nums[i],再查看c是否存在于哈希表中,如果存在则返回这两个数对应的角标;不存在则把当前数组中的这个数添加进哈希表中,然后继续循环。

    代码

    由于这个是在LeetCode刷的第一道题,最开始对LeetCode的代码提交方法不太熟悉;和POJ不一样,LeetCode不使用标准输入/输出作为评判依据,写一个类中的方法(名字已给出),然后进行判断。

    class Solution{
    public:
      vector <int> twoSum(vector <int> &numbers, int target)
      {
        vector <int>  v;
        map <int ,int > m;
        for (int i = 0; i < numbers.size(); ++i){
          if (m.find(target - numbers[i]) != m.end()){
    	    v.push_back(m[target - numbers[i]]);
    	    v.push_back(i);
    	    return v;
          }
          // add into the map
          m[numbers[i]] = i;
        }// end of for
        return v;
      }
    };
    

    方法返回一个int类型的vector,输入是一个vector numbers和一个整数。

    这里面使用的是map,配合map的角标功能实现的哈希表,这个哈希表中的键和值是一样的。

  • 相关阅读:
    23种设计模式
    (C# 基础) 接口
    (C#) Handling and Raising Events
    (C# 基础) 位运算
    (C#) 线程之 AutoResetEvent, EventHandle.
    (C#) 线程基础
    div在固定高的文字垂直居中
    滚动置顶
    jQuery给同一个元素两个点击事件
    (置顶)js实现超过页面一屏后,点击图标滚动到页面顶部top
  • 原文地址:https://www.cnblogs.com/guoyunzhe/p/5843268.html
Copyright © 2020-2023  润新知