zoukankan      html  css  js  c++  java
  • LeetCode 题解 | 1. 两数之和

    题目描述:

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

    你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

    示例:

    给定 nums = [2, 7, 11, 15], target = 9
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

    方法一、暴力解法:

    暴力法很简单,遍历每个元素 [公式] ,并查找是否存在一个值与 [公式] 相等的目标元素。

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
            int len=nums.size();
    
            for(int i=0;i<len-1;i++)
            for(int j=i+1;j<len;j++)
            {
                if(nums[i]+nums[j]==target)
                return {i,j};
            }
            
           return {};
        }
    };
    

    方法二: 一遍哈希

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
    
            unordered_map<int,int> m;
            
            for(int i=0;i<nums.size();i++)
            {
                if(m.find(target-nums[i])!=m.end())//m中存在对应的键值
                    return {m[target-nums[i]],i};//因为i为较大的元素,此时添加进去的键值都还小于i,所以i在后面
    
                m[nums[i]]=i;  //向map中添加元素
            }
            return {};
        }
    };
    

    方法三: 两遍哈希

    class Solution {
    public:
        vector<int> twoSum(vector<int>& nums, int target) {
    
            unordered_map<int,int> m;
    
            for(int i=0;i<nums.size();i++)
                m[nums[i]]=i;   //向map中添加元素
            
            for(int i=0;i<nums.size();i++)
            {
                if(m.find(target-nums[i])!=m.end()&&m[target-nums[i]]!=i)//m中存在对应的键值,并且不为i
                    return {i,m[target-nums[i]]};
            }
            return {};
        }
    };
    
  • 相关阅读:
    (转) 解析 char *p和 char[]
    Linux下C程序内存、内存对齐问题 (实战)
    关于子网划分的两个例子
    子网掩码与子网划分 (转载)
    A、B、C类地址及子网掩码学习笔记
    本机ip、127.0.0.1和0.0.0.0区别(转载)
    初识const
    流媒体协议
    i2c-tools的使用方法
    linux ——内存共享映射mmap和munmap
  • 原文地址:https://www.cnblogs.com/RioTian/p/12395193.html
Copyright © 2011-2022 走看看