LeetCode题解 #1 Two Sum
在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的更多相关文章
- [LeetCode 题解]:Path Sum
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a bi ...
- LeetCode题解39.Combination Sum
39. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T ...
- 《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 ...
- LeetCode 题解之 Two Sum
1.题目描述 2.问题分析 使用hashTable 寻找,target - num[i] ,将时间复杂度降低到 O(n): 3.代码 vector<int> twoSum(vector ...
- LeetCode题解之 two sum 问题
1.题目描述 2.题目分析 考虑使用hashMap的方式将数组中的每个元素和下表对应存储起来,然后遍历数组,计算target 和 数组中每个元素的差值,在hashMap中寻找,一直到找到最后一对. 3 ...
- [LeetCode 题解] Combination Sum
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a se ...
- [LeetCode 题解]: Two Sum
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given an a ...
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- 【LeetCode题解】136_只出现一次的数字
目录 [LeetCode题解]136_只出现一次的数字 描述 方法一:列表操作 思路 Java 实现 Python 实现 方法二:哈希表 思路 Java 实现 Python 实现 方法三:数学运算 思 ...
随机推荐
- PyQt: “AttributeError: 'Form' object has no attribute 'exec_'” when opening second window
# -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication , QMainWindow from PyQt5 ...
- HDU2222 Keywords Search 【AC自动机】
HDU2222 Keywords Search Problem Description In the modern time, Search engine came into the life of ...
- 使用python处理selenium中的获取元素属性问题
# 获取我的订单元素class属性值 at = self.driver.find_element_by_link_text('我的订单').get_attribute('class') # 判断cla ...
- WPF 程序无法触摸操作?我们一起来找原因和解决方法!
WPF 自诞生以来就带着微软先生的傲慢.微软说 WPF 支持触摸,于是 WPF 就真的支持触摸了.对,我说的是"支持触摸",那种摸上去能点能动的:偶尔还能带点儿多指的炫酷效果.但是 ...
- vw+vh+rem响应式布局
科普下: 平时很少用的css单位: 1.长度单位: rem:相对长度单位.相对于根元素(即html元素)font-size计算值的倍数; vw:相对于视口的宽度.视口被均分为100单位的vw; vh: ...
- 相对导入中Attempted relative import in non-package问题
这一篇应该是解释的比较清楚: http://stackoverflow.com/questions/14664313/attempted-relative-import-in-non-package- ...
- uGUI知识点剖析之AutoLayout
http://www.2fz1.com/post/unity-ugui-autolayout/ uGUI知识点剖析之AutoLayout 前文详细介绍过RectTransform,RectTransf ...
- .NET平台上的Model-View-Presenter模式实践
为什么要写这篇文章 笔者当前正在负责研究所中一个项目,这个项目基于.NET平台,初步拟采用C/S部署体系,所以选择了Windows Forms作为其UI.经过几此迭代,我们发现了一个问题:虽然业务逻辑 ...
- 笔记:NPM 无限需要依赖问题解决
笔记:NPM 无限需要依赖问题解决 起因 因为想学一下 VUE,开始跟着教程一步一步输出命令,开始也没有什么问题,一切都很顺利. 突然不知道是哪一步出了问题,一直让我安装依赖,没完没了,开始并不觉得有 ...
- vuejs2.0的生命周期解读
每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM .下图展示的就是一个v ...