Leetcode1.Two Sum---Java

题目:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

解答:

Java解法一:

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
        int[] res = new int[2];
        for (int i = 0; i < nums.length; ++i) {
            m.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; ++i) {
            int t = target - nums[i];
            if (m.containsKey(t) && m.get(t) != i) {
                res[0] = i;
                res[1] = m.get(t);
                break;
            }
        }
        return res;
    }
}

其中,一开始的常规想法是,HashMap中,key存储索引值,value存储nums[i]值,但在根据value值获取key索引值时较为复杂。所以应该转换思维,让HashMap中key存储nums[i]值,value存储索引值。这样便于通过数值获取对饮数组中的索引位置。
Java解法二:

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
        int[] res = new int[2];
        for (int i = 0; i < nums.length; ++i) {
            if (m.containsKey(target - nums[i])) {
                res[0] = i;
                res[1] = m.get(target - nums[i]);
                break;
            }
            m.put(nums[i], i);
        }
        return res;
    }
}

解法一扫描了原数组两次,其实只要稍微改动一下,把两个for循环合并成一个,就可以只扫描原数组一次了。(因为a+b=target中,先找到a和先找到b的性质是一样的。)

解析:

  1. 我们只想用线性的时间复杂度来解决问题,那么就是说只能遍历一个数字,那么另一个数字呢,我们可以事先将其存储起来,使用一个HashMap,来建立数字和其坐标位置之间的映射,我们都知道HashMap是常数级的查找效率,这样,我们在遍历数组的时候,用target减去遍历到的数字,就是另一个需要的数字了,直接在HashMap中查找其是否存在即可,注意要判断查找到的数字不是第一个数字,比如target是4,遍历到了一个2,那么另外一个2不能是之前那个2,整个实现步骤为:先遍历一遍数组,建立HashMap映射,然后再遍历一遍,开始查找,找到则记录index。
  2. HashMap的put方法
import java.util.HashMap;
import java.util.Map;
public class Test {
        public static void main(String[] args) {
                Map<String, String> map = new HashMap<String, String>();
                String p1 = map.put("11", "22");
                System.out.println("p1:" + p1);
                String p2 = map.put("33", "44");
                System.out.println("p2:" + p2);
                String value1 = map.get("11");
                System.out.println("value1:" + value1);
                String p3 = map.put("11", "44");
                System.out.println("p3:" + p3);
                String value2 = map.get("11");
                System.out.println("value2:" + value2);
        }
}

输出结果:

p1:null
p2:null
value1:22
p3:22
value2:44

说明:put方法返回值为null或者value;如果key没有重复,put成功,则返回null,如p1、p2;如果key重复了,返回的是map.get(key),也就是当前这个key对应的value,如上面的p3,key=“11”,而p1的key也是"11",p1与p3重复,返回的是p1的value=“22”,并且将p3覆盖掉p1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值