两数之和--牛客网(HashMap解决)

题目描述

给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2

示例一

输入
[3,2,4],6

输出
[2,3]

暴力解法:

这个没什么好说的。。。。

    public int[] twoSum (int[] numbers, int target) {
        // write code here
        int[] ans = new int[2];

        for (int i = 0; i < numbers.length; i++) {
            ans[0] = i+1;
            int t = target-numbers[i];
            for (int j = i+1; j < numbers.length; j++) {
                if (t == numbers[j]) {
                    ans[1] = j+1;
                    return ans;
                }
            }
        }
        return ans;
    }

利用HashMap解题:

思路:遍历数组,判断map中有没有该元素,如果没有就把target-numbers[i]i放进map里面(保证map里面全是所需的值);如果map中有number[i]元素,则将之前的下标和现在的下标各自加一(因为题目要求的是元素的位置,而不是下标),复制给result数组,该结果就是答案。

要点:

  1. map中存储的是所需的对应元素和自身的下标,通过一次遍历就可以将答案找出!
  2. key存的是数组元素的值;value存的是下标的值。因为map中的get(key)方法可以直接通过key获得value的值,这样就可以直接获得对应下标的值了!
    public int[] twoSum(int[] numbers, int target) {
        int n = numbers.length;
        int[] result = new int[2];
        //map里面放 键为target-每个数的结果 值为下标
        //每次放入的时候看是否包含 当前值
        //有的话说明当前值和已包含的值下标的那个元素为需要的结果
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for(int i=0;i<n;i++){
            if(map.containsKey(numbers[i])){
                result[0] = map.get(numbers[i])+1;
                result[1] = i+1;
                break;
            }
            else{
                map.put(target - numbers[i], i);
            }
        }
        return result;
    }

HashMap一些函数的用法

put() 方法:

// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");

get(key):
该方法可以通过key获取对应的value

// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");
Sites.put(2, "Runoob");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
System.out.println(Sites.get(3));

remove(key) 方法:
该方法通过key来删除对应的键值对(key-value)

// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");
Sites.put(2, "Runoob");
Sites.remove(1);

太多了......

想详细学习的可以去菜鸟教程https://www.runoob.com/java/java-hashmap.html
image

posted @ 2021-04-06 17:07  PureBoy  阅读(194)  评论(0编辑  收藏  举报