在LeetCode做的第一到题

题目大意:给出n个数,在其中找出和为一个特定数的两个数。

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

返回这两个数在原数组内的下标。

我的思路:

1、遍历数组 int temp = target-num[i]

2、查找数组内有没有符合的temp存在。

3、因为这个题目是肯定会有符合条件的两个数的,所以temp肯定存在。

但这样会遇到这些问题:

1、查找最快的是使用二分查找,但是二分查找需要数组有序!

2、给数组排序的话,最快是使用快速排序!

3、但是后来发现,快速排序之后,元素的下标基本改变了,但是题目要求返回原数组中的下标!

4、如果有相同的两个数符合条件的话,返回靠后的那个数,即二分查找要返回最后一个找到的数!

综合以上,就需要使用大量的代码进行修补。

我的解决办法是:

设计一个类

class fuzhu{

public int data;//存放数据
public int ori;//存放原来数组的下标

}

遍历原数组,建立这个fuzhu数组

这样就不会在快排的时候丢失原来的下标。

至于二分查找,因为都是有序的,所以相同的数据都会排在一起,所以在找到一个数只有,只要一直往后遍历看看有没有相同的数就好。

以上是刚开始做的思路,但这种做法真的太麻烦了,懒得贴代码了!

正确做法:HashMap!

1、遍历一次数组,建立一个Map。Map里面 key是元素的值,value是元素原来的下标。

2.不需要排序,不需要二分查找,直接看Map里面有没有temp的key存在(除了自己),返回key的value。

3、由于相同的key会覆盖掉原来的value值,所以Map里面的value值肯定是靠后的那一个!

public static int[] twoSum(int[] nums, int target){

Map<Integer,Integer> hash = new HashMap<Integer,Integer>();
int [] ans = new int [2];

for(int i=0;i<nums.length;i++){

hash.put(nums[i], i);

}

//System.out.println(hash.get(100));

for(int i=0;i<nums.length;i++){

int temp = target - nums[i];
//System.out.println(temp);

if(hash.get(temp)!=null&&hash.get(temp)!=i){

//System.out.println(hash.get(temp));

if(i<=hash.get(temp)){

ans[0]=i+1;
ans[1]=hash.get(temp)+1;
break;

}
else{

ans[0]=hash.get(temp)+1;
ans[1]=i+1;
break;
}

}

}

return ans;

}

总结:这道题如果只是查找有没有这两个数存在的话,用我的第一次的方法是很好的。但是要留意题目说的,返回原来数组中的值,并且要最靠后,用Hash表的话

由于相同的key会覆盖掉原来的value值,所以Map里面的value值肯定是靠后的那一个!所以HashMap真是最好的办法啦。

跟数组有关的题目,很大部分用HashMap可以很快解决。

LeetCode题解 #1 Two Sum的更多相关文章

  1. [LeetCode 题解]:Path Sum

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a bi ...

  2. LeetCode题解39.Combination Sum

    39. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T ...

  3. 《LeetBook》LeetCode题解(1) : Two Sum[E]——哈希Map的应用

    001.Two Sum[E] Two SumE 题目 思路 1双重循环 2 排序 3 Hashmap 1.题目 Given an array of integers, return indices o ...

  4. LeetCode 题解之 Two Sum

    1.题目描述 2.问题分析 使用hashTable 寻找,target  -  num[i] ,将时间复杂度降低到 O(n): 3.代码 vector<int> twoSum(vector ...

  5. LeetCode题解之 two sum 问题

    1.题目描述 2.题目分析 考虑使用hashMap的方式将数组中的每个元素和下表对应存储起来,然后遍历数组,计算target 和 数组中每个元素的差值,在hashMap中寻找,一直到找到最后一对. 3 ...

  6. [LeetCode 题解] Combination Sum

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a se ...

  7. [LeetCode 题解]: Two Sum

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given an a ...

  8. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  9. 【LeetCode题解】136_只出现一次的数字

    目录 [LeetCode题解]136_只出现一次的数字 描述 方法一:列表操作 思路 Java 实现 Python 实现 方法二:哈希表 思路 Java 实现 Python 实现 方法三:数学运算 思 ...

随机推荐

  1. JSP学习(二)JSP指令

    JSP指令 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. JSP指令的基本语法格式:<%@ 指令 属性名= ...

  2. appium python实例脚本1

    #coding=utf-8import os, time, unittestfrom appium import webdriver PATH = lambda p:os.path.abspath(o ...

  3. 如何快速编写和调试 Emit 生成 IL 的代码

    .NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力.利用这项能力,我们能够在运行时生成一段代码/一个方法 ...

  4. 迫不及待地体验了一把 C#8.0 中的可空引用类型(Nullable Reference)

    在我之前的一篇博客 NullReferenceException,就不应该存在! 中,我吐槽了 C# 中 null 的弊端以及避免 null 的方法:事实上这本都是现代高级语言中极力推崇的做法.Kot ...

  5. WPF 跨应用程序域的 UI(Cross AppDomain UI)

    为自己写的程序添加插件真的是一个相当常见的功能,然而如果只是简单加载程序集然后去执行程序集中的代码,会让宿主应用程序暴露在非常危险的境地!因为只要插件能够运行任何一行代码,就能将宿主应用程序修改得天翻 ...

  6. iphone——日期处理

    http://blog.csdn.net/lingedeng/article/details/6996599 Dates NSDate类提供了创建date,比较date以及计算两个date之间间隔的功 ...

  7. Python3 shutil模块

    平时我们总会用到复制文件的命令,Python中自带了相应模块,那就是shutil模块,下面是shutil模块的分析及用法. 1.copyfileobj(fsrc, fdst, length=16*10 ...

  8. {Notes}{LaTeX}{enumerate}

    \usepackage{enumerate} \begin{enumerate}{(1)} \setcounter{enumi}{2} % begin with 2 \item first \item ...

  9. grpc xservice 使用

    1. 安装(此处比较简单) dep 包管理 配置环境变量 GOPATH/bin GO/bin protoc 下载并配置环境变量 2. xservice 安装 a. 预备(一些需要的依赖) mkdir ...

  10. javascript正则表达式定义(语法)

    正则表达式的2种定义方法:一种是直接调用RegExp(),第二种是直接用字面量来定义,即var re = /正则规则/; 2种定义方法本质都是调用RegExp()方法 在调用同一段正则代码的时候,EC ...