虽然题目简单,但我这好不容易优化到前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. Kotlin协程通信机制: Channel

    Coroutines Channels Java中的多线程通信, 总会涉及到共享状态(shared mutable state)的读写, 有同步, 死锁等问题要处理. 协程中的Channel用于协程间 ...

  2. Linux的用户切换、修改用户的用户名和密码

    一.用户切换 "$":普通用户提示符 "#":root用户提示符  1.普通用户到root: 方式一:命令:su然后输入root密码 此种方式只是切换了root ...

  3. 删除排序数组中的重复项II

    Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...

  4. Nginx负载均衡、SSL原理、生成SSL密钥对、Nginx配置SSL

    6月12日任务 12.17 Nginx负载均衡12.18 ssl原理12.19 生成ssl密钥对12.20 Nginx配置ssl扩展 针对请求的uri来代理 http://ask.apelearn.c ...

  5. Block-wise 2D kernel PCA/LDA for face recognition-笔记

    In the present work, we propose a framework for kernel-based 2D feature extraction algorithms tailor ...

  6. mysql客户端 navicat 本地导入sql文件出错

    以前遇到过这个问题,找了半天度娘没解决,然后就放弃了. 因为是自己 demo 的项目 所以就自己手动建表了. 现在实习了,去到公司下载下代码来,拿上sql 导入发现还是报错, 根本没法整,然后自己都不 ...

  7. ansible源码安装、普通用户实现批量控制

    一.ansible简介 ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行 ...

  8. [ch04-04] 多样本单特征值计算

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 4.4 多样本单特征值计算 在前面的代码中,我们一直使用 ...

  9. Java学习笔记(面向对象上)

    面向对象(上) 面向对象的特点:封装性(是面向对象的核心思想,将对象的属性和行为封装起来).继承性(主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展)和多态 ...

  10. 【重磅资料】ArchSummit全球架构师峰会·2019华为云技术专场资料下载

    ArchSummit全球架构师峰会是InfoQ中国团队推出的重点面向高端技术管理者.架构师的技术会议,54%参会者拥有8年以上工作经验.ArchSummit聚焦业界强大的技术成果,秉承"实践 ...