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. java进程状态

    A thread state. A thread can be in one of the following states: NEWA thread that has not yet started ...

  2. 随笔2 PAT1001.A+B Format (20)

    1001.A+B Format(20) 题目链接 1001.A+B Format (20) C++ 代码 第一次使用markdown,还不是很习惯,现在努力的在适应它 首先这道题我们很容易就可以读懂题 ...

  3. POJ 2774 Long Long Message (后缀数组模板)

    借用罗大神的模板,开始搞后缀数组 #include <cstdio> #include <iostream> #include <cstring> #include ...

  4. Linux下的Crontab应用

    crontab是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: /sbin/servic ...

  5. Java的初步认识

    PS:弥补那些错过的时间,弥补那些本是决定做而没有做的事情,当初说好了学习编程要把自己学到的或是理解的写到博客中记录下来,可是由于各种缘由最终是没有实现...经过几番周折决定把那些丢掉的重新捡起来.对 ...

  6. Vagrant 快速入门

    1. Vagrant功能: Vagrant uses Oracle’s VirtualBox to build configurable, lightweight, and portable virt ...

  7. Unity实现相似于安卓原生项目的点击安卓返回button回到前一页的功能

    本章博主和大家一起讨论下Unity怎么实现类似安卓原生项目,点击安卓返回button实现返回到前一个页面的功能. 1.定义一个泛型用于响应安卓的返回button public static List& ...

  8. 从零开始学android开发-项目重命名

    --修改项目名称 选中项目-[refactor]-[rename] --修改package名称 选中需要重命名的包-[refactor]-[rename] --修改gen下面的名称 打开Android ...

  9. Java中static、final用法小结

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  10. 主流手持设备GPU性能比较

    设备 GPU CPU 每秒像素填充率 每秒三角形生成 内存 iPhone4 PowerVR SGX 535 ARM Cortex-A8 800M     512M iPod touch 4 Power ...