题解 | #两数之和#
两数之和
http://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f
遍历数组,用与目标值的差来寻找是否存在数组中
思路
首先声明一个ArrayList,将原数组的数值都存放在该list中,后面可以利用list.indexOf(a)找到元素a第一次出现的索引
遍历数组,获取与目标值target的差值,然后去ArrayList中查找该差值第一次出现的索引
注意:因为ArrayList与原数组一样,所以对于[3, 2, 4] 6这种例子,遍历第一个元素时,差值也为3,此时通过indexOf()得到的索引与遍历数组的i是相同的,所以我们需要额外判断一下i != indexOf(),这样才能找到不同位置的元素
import java.util.*; public class Solution { /** * * @param numbers int整型一维数组 * @param target int整型 * @return int整型一维数组 */ public int[] twoSum (int[] numbers, int target) { // write code here // 使用一个ArrayList来存储原数组 // 遍历原数组,获取到当前遍历到的数值 // 用target与当前数值的差去判断是否存在原数组中 // 此时就可以通过ArrayList的indexOf()来获取另一个数值的索引(即差的索引) int index2 = -1; int index1 = -1; int[] res = new int[2]; int cur = -1; ArrayList<Integer> a = new ArrayList<>(); for (int i = 0; i < numbers.length; i++) { a.add(numbers[i]); } for (index1 = 0; index1 < numbers.length; index1++) { cur = target - numbers[index1]; if (a.indexOf(cur) != -1) { // 注意:因为indexOf()只能返回元素第一次出现的索引,所以遇到例如[0, 1, 2, 0] target=0的情况 // 那么通过indexOf得到的索引也是0,所以这里就需要额外加一个判断条件index1 != indexOf(cur) if (index1 != a.indexOf(cur)) { index2 = a.indexOf(cur); break; } } } // 那对于该例子最终得到的结果是index1=3, index2 = 0,所以这里就额外加个判断吧!看谁大就放在数组后面 if (index1 < index2) { res[0] = index1 + 1; res[1] = index2 + 1; }else { res[0] = index2 + 1; res[1]= index1 + 1; } return res; } }