package com.jokin.learn.Jdk18;
import java.util.*;
/**
* 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
* 两种方法
*/
public class TwoNumSum {
public static void main(String[] args){
int[] t = new int[]{1,2,3,4,5,6};
List<int[]> theRe =new TwoNumSum().twoNumForTarget2(t,9);
System.out.println(theRe);
}
/**
* 使用map进行判断
* @param data
* @param target
* @return
*/
public List<int[]> twoNumForTarget(int[] data,int target){
if(data.length<2){
return null;
}
Arrays.sort(data);
if((data[data.length-1]+data[data.length-2]<target)||(data[0]+data[1]>target)){
return null;
}
ArrayList<int[]> re = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < data.length; i++) {
//判断遍历到的数字,是否是之前需要寻找的目标值
if(map.containsKey(data[i])){
re.add(new int[]{map.get(data[i]),i});
}
//将需要寻找的目标值存储进map
map.put(target-data[i],i);
}
return re;
}
/**
* 方式二,双遍历
* @param data
* @param target
* @return
*/
public List<int[]> twoNumForTarget2(int[] data,int target){
if(data.length<2){
return null;
}
Arrays.sort(data);
if((data[data.length-1]+data[data.length-2]<target)||(data[0]+data[1]>target)){
return null;
}
ArrayList<int[]> re = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < data.length; i++) {
//判断遍历到的数字
for(int j = i+1;j<data.length;j++){
if(target==(data[i]+data[j])){
re.add(new int[]{i,j});
}
}
}
return re;
}
}