leetcode第一题两数之和击败了 98.11% 的用户的答案(C++)
虽然题目简单,但我这好不容易优化到前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;
}
};
leetcode第一题两数之和击败了 98.11% 的用户的答案(C++)的更多相关文章
- LeetCode 第一题 两数之和
题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组 ...
- leetcode刷题--两数之和(简单)
一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...
- leetCode刷题 | 两数之和
两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...
- 【leetcode 简单】第一题 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- LeetCode刷题:第一题 两数之和
从今天开始刷LeetCode 第一题:两数之和 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种 ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- 每日一道 LeetCode (1):两数之和
引言 前段时间看到一篇刷 LeetCode 的文章,感触很深,我本身自己上大学的时候,没怎么研究过算法这一方面,导致自己直到现在算法都不咋地. 一直有心想填补下自己的这个短板,实际上又一直给自己找理由 ...
- Leetcode系列之两数之和
Leetcode系列之两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你 ...
- leetcode每日一题——两数之和
题目: 两数之和 难度: 简单 描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 解法: class Solutio ...
随机推荐
- Kotlin协程通信机制: Channel
Coroutines Channels Java中的多线程通信, 总会涉及到共享状态(shared mutable state)的读写, 有同步, 死锁等问题要处理. 协程中的Channel用于协程间 ...
- Linux的用户切换、修改用户的用户名和密码
一.用户切换 "$":普通用户提示符 "#":root用户提示符 1.普通用户到root: 方式一:命令:su然后输入root密码 此种方式只是切换了root ...
- 删除排序数组中的重复项II
Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...
- 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 ...
- 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 ...
- mysql客户端 navicat 本地导入sql文件出错
以前遇到过这个问题,找了半天度娘没解决,然后就放弃了. 因为是自己 demo 的项目 所以就自己手动建表了. 现在实习了,去到公司下载下代码来,拿上sql 导入发现还是报错, 根本没法整,然后自己都不 ...
- ansible源码安装、普通用户实现批量控制
一.ansible简介 ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行 ...
- [ch04-04] 多样本单特征值计算
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 4.4 多样本单特征值计算 在前面的代码中,我们一直使用 ...
- Java学习笔记(面向对象上)
面向对象(上) 面向对象的特点:封装性(是面向对象的核心思想,将对象的属性和行为封装起来).继承性(主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展)和多态 ...
- 【重磅资料】ArchSummit全球架构师峰会·2019华为云技术专场资料下载
ArchSummit全球架构师峰会是InfoQ中国团队推出的重点面向高端技术管理者.架构师的技术会议,54%参会者拥有8年以上工作经验.ArchSummit聚焦业界强大的技术成果,秉承"实践 ...