
思路:
方法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/tech/pnotes/278084.html