Question:

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={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

Question Tags:

Array , Hash Table

New Words:

add up to:总计达

indices:index的复数

zero-based:从零开始的

Solution Ideas:

思路一:

两层遍历法:对于数组中的某一个数,对它及他以后的某个数求和,若和与target相等,则可确定这两值为所找的。此方式时间复杂度为O(nlogn).

思路二:

HashMap--Value-key法:求a+b=target,也就是判断a和target-a是否都在这个数组中,

           遍历判断map中是否有数组中的某个值target-a,如果没有,则把a的key以value作为key存到map中,

           如果有,则所求的a,b得出来了。所求的索引值也就是a,b的索引值

           此方法时间复杂度为O(n)

两种方法都可以确保index1<index2.

只考虑时间复杂度的情况下,由O(n)<O(nlogn)知,思路二的效率更高。

Solution Java code:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map; public class TwoSum { public static void main(String[] args) {
int[] numbers={2, 7, 11, 15};
int target = 9;
int[] twoSum = twoSum(numbers,target);
System.out.println("two sum indices are " + twoSum[0] + " and " + twoSum[1]); int[] twoSum2 = twoSum2(numbers,target);
System.out.println("two sum indices are " + twoSum2[0] + " and " + twoSum2[1]);
}

//思路1
public static int[] twoSum(int[] numbers, int target) {
int i,j,sum;
int[] indices = new int[2]; outfor:for (i=0;i<numbers.length;i++){
for (j=i+1;j>i && j<numbers.length;j++){
sum = numbers[i]+numbers[j];
if (sum == target){
indices[0]=i+1;
indices[1]=j+1;
break outfor;
}
}
}
return indices;
}

  //思路2
public static int[] twoSum2(int[] numbers, int target) { int[] indices = new int[2]; Map<Integer,Integer> map = new HashMap<Integer,Integer>(); for (int i=0;i<numbers.length;i++){
if (map.containsKey(target-numbers[i])){
indices[0]=map.get(target-numbers[i]);
indices[1]=i+1;
break;
}
map.put(numbers[i],i+1);
}
return indices;
}
}

思路2也可以使用hash table表达:

public static int[] twoSum3(int[] numbers, int target) {

        int[] indices = new int[2];

//        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
Hashtable<Integer, Integer> hashtable = new Hashtable<Integer, Integer>(); for (int i=0;i<numbers.length;i++){
Integer num = hashtable.get(numbers[i]);
if (num == null) hashtable.put(numbers[i], i);
num = hashtable.get(target-numbers[i]);
if ( num != null && num < i) {
indices[0] =num + 1;
indices[1] = i+1;
return indices;
}
}
return indices;
}

【LeetCode 1】算法修炼 --- Two Sum的更多相关文章

  1. 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)

    转自  http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...

  2. Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

    Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划) 题目描述 已知一个正方形二维数组A,我们想找到一条最小下降路径的和 所谓下降路径是指,从一行到 ...

  3. LeetCode初级算法(数组)解答

    这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...

  4. [leetcode]364. Nested List Weight Sum II嵌套列表加权和II

    Given a nested list of integers, return the sum of all integers in the list weighted by their depth. ...

  5. LeetCode初级算法的Python实现--排序和搜索、设计问题、数学及其他

    LeetCode初级算法的Python实现--排序和搜索.设计问题.数学及其他 1.排序和搜索 class Solution(object): # 合并两个有序数组 def merge(self, n ...

  6. LeetCode初级算法的Python实现--链表

    LeetCode初级算法的Python实现--链表 之前没有接触过Python编写的链表,所以这里记录一下思路.这里前面的代码是和leetcode中的一样,因为做题需要调用,所以下面会给出. 首先定义 ...

  7. LeetCode初级算法的Python实现--字符串

    LeetCode初级算法的Python实现--字符串 # 反转字符串 def reverseString(s): return s[::-1] # 颠倒数字 def reverse(x): if x ...

  8. LeetCode初级算法的Python实现--数组

    LeetCode初级算法的Python实现--数组 # -*- coding: utf-8 -*- """ @Created on 2018/6/3 17:06 @aut ...

  9. LeetCode:算法特辑——二分搜索

    LeetCode:算法特辑——二分搜索 算法模板——基础 int L =0; int R =arr.length; while(L<R) { int M = (R-L)/2+L; if(arr[ ...

随机推荐

  1. Hibernate资源

    正在学马士兵Hibernate的同学来看这里,这里提供了他视频里需要的JAR包,请尽情下载,给好评喔. 一.Hibernate 3.3.2 核心JAR包 http://pan.baidu.com/s/ ...

  2. 【Android框架进阶〖0〗】ThinkAndroid注解机制

    由于项目需要,开始研究ThinkAndroid. 个人认为该框架的注解机制十分新颖,所以先研究这个,顺便学习下 Java 的annotation. 粗略的看了看,该机制在BaseActivity中初始 ...

  3. Windows 消息机制详解

    总的来说: MSG包括: 窗口句柄,指示MSG发送的目的窗口 消息标识 lPARAM.wParam 发送时间 发送时的鼠标位置   关于消息队列: Windows系统有一个系统消息队列 每个线程都有一 ...

  4. Winfrom子窗体刷新父窗体

    本人比较懒,直接从网上转载了一篇比较合适的文章,只是文章格式有点乱,地址是 http://aspnet.blog.163.com/blog/static/17515510920121126104433 ...

  5. c++中智能输出文件

    首先我们要为每一时间步,设置一个文件名: ] = "; itoa(time,timestr,); std::string s; s += timestr; std::string path ...

  6. 利用css中的border生成三角,兼容包括IE6的主流浏览器

    1.生成四个不同颜色方向的梯形 #ladder{ width:20px; height:20px; border:10px solid; border-color:#ff3300 #0000ff #3 ...

  7. 关于c#中的Timer控件的简单用法

    Timer控件主要会用到2个属性一个是Enabled和IntervalEnabled主要是控制当前Timer控件是否可用timer1.Enabled=false;不可用timer1.Enabled=t ...

  8. 【Python笔记】图片处理库PIL的源代码安装步骤

    前段时间项目须要对某些图片打水印,用到Python的PIL库,本文以Imaging-1.1.7为例,记录PIL库的源代码编译/安装步骤. PIL全称Python Image Library.它支持多种 ...

  9. cocos2d-x 3.1.1 学习笔记[3]Action 动作

    这些动画貌似都非常多的样子,就所有都创建一次. 代码例如以下: /* 动画*/ auto sp = Sprite::create("card_bg_big_26.jpg"); Si ...

  10. Unity3D中使用Leap Motion进行手势控制

    Leap Motion作为一款手势识别设备,相比于Kniect,长处在于准确度. 在我的毕业设计<场景漫游器>的开发中.Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中 ...