题目描述:
给定一个整数数组num,从数组中找出两个数满足相加之和等于目标数target,假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素,返回两数的下标值,以数组的形式返回
可以采用两种方法:
①暴力算法,i从第一个数值开始遍历,j从第二个数值开始遍历,两个数值相加,检测两者的值是否为目标值target,两个for循环嵌套。
②利用一个map存放数组中的所有数值,遍历数组中的元素,检测target-num[i]是否在map中存在l,在把对应下标放入数组中需要判断,二者是否相等,如果不相等则放入。
代码:
package 无序数组;
/**
* @author:MrQ
* @date 2021/7/30-9:15
*/
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 求数组的两数之和
* 给定一个数值target
*/
public class main {
public static void main(String[] args) {
int[] result = solution(new int[]{1, 2, 3, 4, 5, 6}, 10);
if (result==null){
System.out.println("未找到对应的下标");
}else {
System.out.println(result[0]);
System.out.println(result[1]);
}
System.out.println("-------------------------------------------------------------");
int[] result01 = solution01(new int[]{1, 2, 3, 4, 5, 6}, 12);
if (result01 == null){
System.out.println("未找到对应的下标");
}else {
System.out.println(result01[0]);
System.out.println(result01[1]);
}
}
/**
* 使用暴力算法破解
* i从第一个数开始遍历,j从第二个数开始遍历
* 访问i,j 对应的数值,然后后相加,如果二者等于目标值target,那么就把i,j放入到result数组中。
* @param num
* @return
*/
public static int[] solution(int num[],int target){
int[] result = new int[2];
for (int i=0;i<num.length;i++){
for (int j=i+1;j<num.length;j++){
if (num[i] + num[j] == target){
result[0] = i;
result[1] = j;
return result;
}
}
}
return null;
}
/**
* 我们不需要多次遍历一个数组
* 有了一个target,通过遍历一次数组,我们就可以得出答案
* 首先,先把数组放入到一个Map中
* 然后遍历数组,用target-num[i]检测其值是否存在于map中,如果存在则返回两者对应的下标
* 否则放回null
* @param num
* @param target
* @return
*/
public static int[] solution01(int []num,int target){
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for (int i=0;i<num.length;i++){
//把数组中的值放入到map中
map.put(num[i],i);
}
for (int i=0;i<num.length;i++){
int result = target - num[i];
if (map.containsKey(result)) {
if (map.get(result) != i){
return new int[]{i, map.get(result)};
}
}
}
return null;
}
}