/* * Two Sum * * 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 */
思路:
思路1:对于每一个元素,遍历寻找另一个元素使得和为target,时间复杂度O(n^2)。
思路2:先排序,然后首尾两个指针向中间靠拢,两指针所指元素大于target,移动尾指针,小于target移动头指针,直至找到结果或者两个指针相遇。
时间复杂度O(nlogn)。此方法可推广值3Sum,4Sum等。
但是在这个题目中,排序后会改变元素的下标,所以不太可取。
思路3:利用hashmap,将每个元素值作为key,数组索引作为value存入hashmap,然后遍历数组元素,在hashmap中寻找与之和为target的元素。
·时间复杂度O(n),空间复杂度O(n)。
hashmap 和 hashTable的区别:
1. hashmap是单线程的,不安全,hashtable是多线程的安全
2. hashmap可以允许 值和键为空, hashtable不允许。
在下面的代码中,用的是hashtable,有点不太合适,可以改为hashmap。
Java代码:
1 package com.hb.leetcode; 2 3 import java.util.Hashtable; 4 5 import offer.utilities.ArrayUtils; 6 7 8 /* 9 * Two Sum 10 */ 11 public class TwoSum { 12 public int[] twoSum(int[] numbers, int target) { 13 int[] result = new int[2]; 14 //放数组值 和 下标 15 Hashtable<Integer, Integer> numstable = new Hashtable<Integer, Integer>(); 16 17 for(int i = 0 ; i < numbers.length ; i++){ 18 //对没一个数边放边查找 19 if(numstable.get(target - numbers[i]) != null){ 20 result[0] = numstable.get(target - numbers[i]) + 1; 21 result[1] = i + 1; 22 23 }else{ 24 numstable.put(numbers[i], i); 25 } 26 } 27 return result; 28 } 29 30 public static void main(String[] args) { 31 int numbers[] = {3,4,2}; 32 int target = 6 ; 33 TwoSum test = new TwoSum(); 34 int indices[] = test.twoSum(numbers, target); 35 ArrayUtils.printArray(indices); 36 } 38 39 }