虽然题目简单,但我这好不容易优化到前2%,感觉也值得分享给大家(方法比较偷机)

题目:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

给定 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) {
vector<int> res();
int endPos = nums.size();
//vector内存是连续的 这里直接取地址
//这样后面访问时不需要调用vecotr的成员函数
//因为不清楚编译器优化级别
int *numArr = &nums[]; if (endPos < )
{
//数组长度比较小时使用原始的双循环法更快点
for (int i = ; i < endPos; ++i)
{
//遍历数组,找出每个元素与target之差做为寻找目标
int nNeed = target - numArr[i];
for (int j = i + ; j < endPos; ++j)
{
//在后面找,看有没有与目标相同的数字
if (numArr[j] == nNeed)
{
//如果有直接返回
res[] = i;
res[] = j;
return res;
}
}
}
} //数组比较大时使用一次遍历哈希查找的方法比较快
map<int, int> mpNums;
pair<map<int, int>::iterator, bool> pairRet;
//int numCurr; //遍历数组
for (int i = ; i < endPos; ++i)
{
//把当前数值当key,当前位置当value插入map
//numCurr = numArr[i]; //实验发现这里使用numCurr取值代替numArr[i]反而慢了
//看来读取消耗远低于写
pairRet = mpNums.insert(make_pair(numArr[i], i)); //如果插入成功(大部分情况下是插入成功的)
if (pairRet.second)
{
//查看map里面是否有目前值-当前元素值的数据存在
//如果有就说明找到目标
int numNeed = target - numArr[i];
map<int, int>::iterator it = mpNums.find(numNeed);
if (it != mpNums.end() && it->second != i)
{
//题目要求不能重复使用自己,所以需要限制it->second != i
res[] = it->second;
res[] = i;
return res;
}
}
else
{
//如果插入失败说明
//已经在map存在相同数值,则看它们加起来是否等于target
if ((numArr[i] << ) == target) //2 * numArr[i]
{
res[] = pairRet.first->second;
res[] = i;
return res;
}
}
} res.clear();
return res;
} };
执行结果:

通过
显示详情
执行用时 :8 ms, 在所有 cpp 提交中击败了98.11%的用户
内存消耗 :10.1 MB, 在所有 cpp 提交中击败了37.46%的用户

leetcode第一题两数之和击败了 98.11% 的用户的答案(C++)的更多相关文章

  1. LeetCode 第一题 两数之和

    题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...

  2. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

  3. leetCode刷题 | 两数之和

    两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...

  4. 【leetcode 简单】第一题 两数之和

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...

  5. LeetCode刷题:第一题 两数之和

    从今天开始刷LeetCode 第一题:两数之和 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种 ...

  6. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  7. 每日一道 LeetCode (1):两数之和

    引言 前段时间看到一篇刷 LeetCode 的文章,感触很深,我本身自己上大学的时候,没怎么研究过算法这一方面,导致自己直到现在算法都不咋地. 一直有心想填补下自己的这个短板,实际上又一直给自己找理由 ...

  8. Leetcode系列之两数之和

    Leetcode系列之两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你 ...

  9. leetcode每日一题——两数之和

    题目: 两数之和 难度: 简单 描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 解法: class Solutio ...

随机推荐

  1. 【Luogu P1981】表达式求值

    点我进入原题Luogu P1981 [解题思路] 仔细分析题目,这就是一道模拟题…… 直接按照符号读入全部的数字,先算乘法,最后把全部数加起来就是结果了 记得要%10000取最后四位 [参考程序] # ...

  2. JVM的类加载机制全面解析

    什么是类加载机制 JVM把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制. 如果你对Class文件的结 ...

  3. 使用 sroll-snap-type 优化滚动

    根据 CSS Scroll Snap Module Level 1 规范,CSS 新增了一批能够控制滚动的属性,让滚动能够在仅仅通过 CSS 的控制下,得到许多原本需要 JS 脚本介入才能实现的美好交 ...

  4. LNMP架构源码搭建(centos7)

    第一步:安装nginx 1.上传或下载nginx,并解压 yum -y install lrzsz rz .tar.gz 2.搭建nginx安装环境 yum -y install gcc-c++ zl ...

  5. mac安装pip

    1.下载get-pip.py curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py SaintKings-Mac-mini ...

  6. Hyperledger Fabric手动生成CA证书搭建Fabric网络

    之前介绍了使用官方脚本自动化启动一个Fabric网络,并且所有的证书都是通过官方的命令行工具cryptogen直接生成网络中的所有节点的证书.在开发环境可以这么简单进行,但是生成环境下还是需要我们自定 ...

  7. .Net core_Excel 导出二维码(以导出箱单为例)

    [AccessLogAttribute(Note = "导出条形码箱单 — 条形码")]public ActionResult ExportContract(string INNE ...

  8. BZOJ 3108: [cqoi2013]图的逆变换

    3108: [cqoi2013]图的逆变换 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 627  Solved: 415[Submit][Statu ...

  9. 使用Spring Boot和AspectJ实现方法跟踪基础结构

    了解如何使用Spring Boot和AspectJ实现方法跟踪基础结构!最近在优锐课学习收获颇多,记录下来大家一起进步! 在我们的应用程序中,获取方法的堆栈跟踪信息可能会节省很多时间.具有输入输出参数 ...

  10. 深入理解 Java 反射和动态代理