lintcode第56题(两数之和)

  • 题目

给定一个整数数组,找到两个数字,使它们加起来成为一个特定的目标数字。

该函数twoSum应返回两个数字的索引,以使它们加起来等于目标,其中index1必须小于index2。请注意,您返回的答案(index1和index2)都是从零开始的。(您可以假设每个输入都只有一个解决方案)

样例:

Example1:
numbers=[2, 7, 11, 15], target=9
return [0, 1]
Example2:
numbers=[15, 2, 7, 11], target=9
return [1, 2]
  • 分析

  1. 借助hashmap,存储映射:特定的目标数字target与整数数组numbers[i]之差 作为key,作为value
  2. 接着遍历整数数组,判断是否存在numbers[j]等于target-numbers[i],若存在,说明numbers[i]+numbers[j]==target,{i,j}即为所得。
  3. 若不存在,执行1;接着遍历整数数组。
  • 题解 

package lintcode;

import java.util.HashMap;

public class Solution_56 {
	
	public int[] twoSum(int[] numbers, int target) {
        HashMap<Integer,Integer> map = new HashMap<>();

        for (int i = 0; i < numbers.length; i++) {
        	//get方法:获取指定键(key:numbers[i])所对应的值(value:i),不存在映射则为null
            if (map.get(numbers[i]) != null) //有映射,即numbers[i++]==target - numbers[i]  	
            {
                int[] result = {map.get(numbers[i]), i};//{ 原来的i(就近取), 现在的i }
                return result;
            }
            else
            	//put方法:将指定的键与值对应起来,并添加到集合中
            	map.put(target - numbers[i], i);//第一次:<key,value>,...hashmap可存储多组映射          
        }
        //遍历完后没有符合的,则返回空值
        int[] result = {};
        return result;
    }

	
	public static void main(String[] args) {
		//对象
		Solution_56 solution = new Solution_56();
		int numbers[]= {11,7,7,2,15};
		int result[]=solution.twoSum(numbers,9);
		System.out.print("[");
		System.out.print(result[0]+","+result[1]);
		System.out.print("]");
	}

}

运行结果:

 

结果分析:

 此段代码中用到的HashMap{key,value}的方法:

put(Object key,Object value):将映射Key-value添加进HashMap中。这里是put(target - numbers[i], i);也就是值和下标。

get(Object key):根据key获取指定的value。这里是get(numbers[i]);获取和值映射的下标。

参考链接:https://www.jiuzhang.com/solutions/two-sum/ ,https://blog.csdn.net/weixin_41434306/article/details/88582800

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值