• 欢迎光临~

牛客 NC61 两数之和(Java 哈希表)

开发技术 开发技术 2022-07-31 次浏览
牛客 NC61 两数之和(Java 哈希表)

 

 

思路:
方法1:仍然是暴力拆解。但是题目要求时间复杂度要O(nlogn),如果暴力拆解的话,时间复杂度有O(n²)了
 
方法2:(看了提示)
哈希Map法
申请一个哈希表,数组从第一个开始,验证哈希表中是否有这个元素和表中元素相加为target值的,若有,则返回其key,若无,则将(key,value)其中key为此时下标,value为当前元素。直至数组遍历完成。
import java.util.*;




public class Solution {
    /**
     *
     * @param numbers int整型一维数组
     * @param target int整型
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        // write code here
        int len = numbers.length;//数组长度
        int findNumber = 0;//初始化“欲匹配数值”对象
        int i = 0;//遍历数组元素对象下标
        int key = 0;//预取对象下标
        int[] result = {0};


            
            
        Map<Integer,Integer> ages = new HashMap<Integer,Integer>();//哈希表
        for(i = 0;i < len;i++){//遍历数组
            if(ages.containsValue(target - numbers[i])){//若存在欲匹配对象返回其Key
                System.out.println(target - numbers[i]);
                key = getKey(ages,target - numbers[i]);
                //System.out.println(key);
                if(i+1>key){//返回下标由小到大
                    return new int[] {key,i+1};
                }else{
                    return new int[] {i+1,key};
                }


            }else{
                ages.put(i+1,numbers[i]);//若不存在则将此值和下标对应放入哈希表
                //返回的数组下标从1开始算,所以要+1存进去
                //System.out.println(numbers[i]+"   "+i);
            }
        }
        return null;


    }
    
    public <K, V> K getKey(Map<K, V> map, V value) {//反转哈希表,由值查键
        for (Map.Entry<K, V> entry : map.entrySet()) {
            if (entry.getValue().equals(value)) {
                System.out.println(entry.getKey());
                return entry.getKey();
            }
        }
        return null;
    }
    
    
}

结果:

牛客 NC61 两数之和(Java 哈希表)

 

 

答案:

import java.util.HashMap;
public class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] res = {0,0};//保存结果
        HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();//定义一个哈希表存储numbers[i]和对应的下标
        for(int i = 0;i < numbers.length;i ++){//进行标记
            mp.put(numbers[i],i);
        }
        for(int i = 0;i < numbers.length;i ++){
             //每遍历一个numbers[i]就去对应的mp里找有没有target - numbers[i]
             //如果有就返回结果
             //如果没有就找下一个
            if(mp.containsKey(target-numbers[i]) && i != mp.get(target - numbers[i])){
                res[0] = i + 1;
                res[1] = mp.get(target-numbers[i]) + 1;
                return res;
            }
        }


        return res;
    }
}

 

牛客 NC61 两数之和(Java 哈希表)

 

 

修改后:

import java.util.*;








public class Solution {
    /**
     *
     * @param numbers int整型一维数组
     * @param target int整型
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        // write code here
        int len = numbers.length;//数组长度
        int findNumber = 0;//初始化“欲匹配数值”对象
        int i = 0;//遍历数组元素对象下标
        int key = 0;//预取对象下标
        int[] result = {0};
            
        Map<Integer,Integer> ages = new HashMap<Integer,Integer>();//哈希表
        for(i = 0;i < len;i++){//遍历数组
            if(ages.containsKey(target - numbers[i])){//若存在欲匹配对象返回其Value
                System.out.println(target - numbers[i]);
                key = ages.get(target - numbers[i]);
                //System.out.println(key);
                if(i+1>key){//返回下标由小到大
                    return new int[] {key,i+1};
                }else{
                    return new int[] {i+1,key};
                }




            }else{
                ages.put(numbers[i],i+1);//若不存在则将此值和下标对应放入哈希表
                //返回的数组下标从1开始算,所以要+1存进去
                //System.out.println(numbers[i]+"   "+i);
            }
        }
        return null;
    }
    
}
 
通过。
 
 
 
谷歌:
1.哈希表及其java语法
Java哈希表入门 - scyq - 博客园 (cnblogs.com)
哈希表就是map的一种实现。key-value形式存储
 
//导入哈希表的工具包
import java.util.HashMap;
import java.util.Map;
//创建哈希表
Map<String ,Integer> Ages = new HashMap<String,Integer>();
//常用方法
get(Object key);//返回key映射的value值
put(K key,V value);//将键和值建立映射关系,如果key未存在,直接存,如果已存在就更新value
remove(Object key);//如果对应key存在映射关系的值,将其移除并返回值
containsKey(Obejct key);//是否存在此key
containsValue(Object value);//是否存在此value

isEmpty();//判断集合是否为空
clear();//移除所有的Entry键值对
entrySet();//返回一个键值对的Set集合
keySet()'//返回所有key的集合
valueSet();//返回所有value的集合
size();//键值对对数
见补充:
Java HashMap获取值的几种方式_Brett-Xu的博客-CSDN博客_hashmap拿值

 

 
2.哈希表由值查健
(14条消息) Java Map通过值来获取键的正确姿势_明明如月学长的博客-CSDN博客_map根据值获取键
    public <K, V> K getKey(Map<K, V> map, V value) {//反转哈希表,由值查键
        for (Map.Entry<K, V> entry : map.entrySet()) {
            if (entry.getValue().equals(value)) {
                return entry.getKey();
            }
        }
        return null;
    }

 

程序员灯塔
转载请注明原文链接:牛客 NC61 两数之和(Java 哈希表)
喜欢 (0)