题目:

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={, , , }, target=
Output: index1=, index2= 函数原型:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
}
};

解题思路:

1、暴力法:两个for循环遍历,时间复杂度为O(N^2),会超时。

2、排序法:这里有两种思路:

  1)排好序后,利用区间法来计算两个数的和(两个指针分别指向首尾,逐步向中间收缩)

  2)排好序后,固定一个元素a[i],在余下的数中查找target - a[i],查找可用二分查找法,时间复杂度为O(lgn)。

该种方法的时间复杂度为O(nlgn)。

注意:这种方法由于采用了排序,故每个数的index会改变,所以,必须将每个数和它的index进行关联,我们第一时间想到map,但是map不允许有重复的元素出现,故不合适。进而可以想到结构体,每个数有两个属性:value和index,这样就搞定了。

3、hashtable法:时间复杂度降为O(N)。思想来自排序法的第一种思路,这种方法用到了查找,总所周知,查找最快的方法就是采用hash表。但是前面也说过,hash不能存储重复的元素,比如(0,3,2,0),只存储3个元素,那查找后就无法得到正确答案。这个时候就需要想一种方法来避免这种情况,我们可以这样来做:来一个元素a[i],我们检查它是否在hash表中,不在就插入,然后检查target-a[i]是否在表中,如果在,得到结果。这样就可以得到我们想要的结果,千万不要把所有元素都插入了,再来查找,不然就得不到答案。

代码展示:

排序法:(第一种思路)

 //方法一:排序法
struct SNode {
int value;
int pos;
}; bool cmp(SNode a, SNode b)
{
return a.value < b.value;
} vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size(); vector<int> vecRet;
vector<SNode> vecNode; for (int i=; i < n; i ++) {
SNode temp;
temp.value = nums[i];
temp.pos = i+;
vecNode.push_back(temp);
}
sort(vecNode.begin(),vecNode.end(), cmp); int i = , j = n-;
while(i < j) {
int sum = vecNode[i].value + vecNode[j].value;
if (sum == target) {
if(vecNode[i].pos < vecNode[j].pos){
vecRet.push_back(vecNode[i].pos);
vecRet.push_back(vecNode[j].pos);
break;
}
if (vecNode[i].pos > vecNode[j].pos) {
vecRet.push_back(vecNode[j].pos);
vecRet.push_back(vecNode[i].pos);
break;
}
}
else if (sum > target)
j--;
else
i ++;
}
return vecRet;
}

hashtable法:

 //方法二:hashtable法
vector<int> twoSum1(vector<int>& nums, int target)
{
int i, sum;
vector<int> results;
map<int, int> hmap;
for(i=; i<nums.size(); i++){
if(!hmap.count(nums[i])){
hmap.insert(pair<int, int>(nums[i], i));
}
if(hmap.count(target-nums[i])){
int j=hmap[target-nums[i]];
if(j<i){
results.push_back(j+);
results.push_back(i+);
return results;
}
}
}
return results;
}

LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium的更多相关文章

  1. Java 找到数组中两个元素相加等于指定数的所有组合

    思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...

  2. java实现 数组中两个元素相加等于指定数的所有组合

      package com.algorithm.hash; public class alg1 { public static void main(String argv[]) { int[] arr ...

  3. [LeetCode] 39. Combination Sum ☆☆☆(数组相加等于指定的数)

    https://leetcode.wang/leetCode-39-Combination-Sum.html 描述 Given a set of candidate numbers (candidat ...

  4. leetcode 415 两个字符串相加

    string addstring(string s1,string s2) { string ans=""; ; ,j=s2.length()-;i>=||j>=;i- ...

  5. 001 Two Sum 两个数的和为目标数字

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  6. 领扣(LeetCode)两数之和II - 输入有序数组 个人题解

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  7. 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等

    题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...

  8. NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论:22页2.3-7 描述一个运行时间为O(nlogn)的算法,找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解: a=[1,3,6,7,9,15,29] def find2sum ...

  9. 深入子元素的width与父元素的width关系

    深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...

随机推荐

  1. 201621123002《Java程序设计》第八周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 从源代码中可以看出 ...

  2. ubuntu 18.04输入法问题

    ubuntu 18.04输入法IBus出现问题.打字的弹窗只选择数字1对应的汉字,选择2,3,4,5等数字对应的汉字,就会出现问题. 例如下图只能选择1 不能选择2 3 4 5. 删除了~/.cach ...

  3. 7行代码,彻底告别python第三方包import导入问题!

    最近有不少小伙伴咨询关于pyton第三方包导入的问题,今天我们就来聊聊第三方包导入那些事. 随着对python学习的渐入臻境,越来越多的小伙伴们开始导入自己所需的第三方包,实现各种各样的功能.但是,他 ...

  4. javascript、JSP、JS有什么区别和联系

    js是javascript的缩写.以下是JSP与JS的区别和联系: 名字:JS:JavaScriptJSP:Java Server Pages 执行过程:JSP先翻译,翻译成Servlet执行如: t ...

  5. window环境下修改postgrep密码

    本机window7 64位系统,安装的PostgreSQL 9.3 默认安装是没有设置密码的,使用pgAdmin III登陆需要登陆密码. 我们使用默认安装的工具 SQL Shell 来操作. 我们依 ...

  6. 获取mp3文件的采样率

    /** * 获取mp3文件的采样率 * @param filefullname 文件完整路径 * @return 采样率 */public int getMp3SampleRate(String fi ...

  7. 算法学习笔记:knn理论介绍

    阅读对象:了解指示函数,了解训练集.测试集的概念. 1.简介 knn算法是监督学习中分类方法的一种.所谓监督学习与非监督学习,是指训练数据是否有标注类别,若有则为监督学习,若否则为非监督学习.所谓K近 ...

  8. centos7安装mariadb

    ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 1.官方um安装mariadb 1).准备官方yum [mariadb ...

  9. HTML5结构标签

    <!DOCTYPE html> <!-- ↑ 文档声明.HTML5已经简化为上述样式! 注意:文档声明必须有!而且必须在文档页面的第一行!   HTML4.01之前的文档声明: &l ...

  10. ArcSDE

    ArcSDE,即数据通路,是ArcGIS的空间数据引擎,它是在关系数据库管理系统(RDBMS)中存储和管理多用户空间数据库的通路.从空间数据管理的角度看,ArcSDE是一个连续的空间数据模型,借助这一 ...