一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
思路
1、首先,这个题目的难点在于,怎么快速的将符合条件的整数跟角标找到 2、通过遍历的方式,将数据依次遍历,可以用两次for循环来处理,但是在数据量很大的时候,这个就不适合了 3、采用map结构,用key-value的方式来存储值跟角标。再每次遍历的时候,将读过的数据存起来,然后在进行遍历的过程中,通过当前值跟目标值相减的值作为key,判断map结构中是否包含,如果包含,则代表已经找到
代码实现
public static void main(String[] args) {
int[] arr = {1, 2, 5, 6, 8, 9, 3, 8, 9, 3, 6, 8, 0, 1, 3, 5, 6, 78};
int[] ints = twoNums(arr, 8);
System.out.println("位置1:" + ints[0] + " 位置2 :" + ints[1]);
}
public static int[] twoNums(int[] arr, int target) {
//根据传入的数据长度来定义hashMap的初始空间,优化内存。
HashMap<Integer, Integer> temMap = new HashMap<>(arr.length);
//开始遍历,从arr中依次读取数据
for (int i = 0; i < arr.length; i++) {
//在每次循环的时候,需要通过目标值target减去当前数组中i位置的值,
//如果在tempMap中包含key的话,就代表已经找到了,返回结果
if (temMap.containsKey(target - arr[i])) {
return new int[]{temMap.get(target - arr[i]), i};
}
//每次遍历,将经历的数值存入
temMap.put(arr[i], i);
}
throw new IllegalArgumentException("没有符合条件的数据!");
}
输出结果
位置1:1 位置2 :3
总结
两数之和,是LeetCode的第一题,也是各位刷题开始的第一个题目。我在一开始接触这些算法的时候,感觉很懵,首先想到的就是暴力解法,虽然可以实现,但感觉不优雅,看过题解之后,才发现,原来还可以这样,算法,在平时的开发中可能不会用到,但学习他,可以帮助程序员提高思维能力,以及解决问题的时候,提供多种解决想法。