思路:
方法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; } }
结果:
答案:
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; } }
修改后:
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; }
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/278084.html