本篇记录leetcode的twoSum问题。
twoSum问题官方描述在这里,翻译过来大致是:
给定一个整数数组input,如:2,7,9,4,数字target,如:11,从整数数组中找出两个数,使得两个数字之和为target,如:2+9=11,打印这两个数在数组中的下标,数组下标从1开始。
问题分析:
问题很简单,但是可能需要考虑数组中数字重复,两个整数和溢出整数范围,数组中找不到两个整数的和为target等情况。
简化问题,也就是说:
- 数组中数字重复只考虑下标靠前的
- 找不到两个整数和为target时,返回两个下表都是0
下面是OJ Accepted的代码:
public static int[] twoSum(final int[] input, final long target) {
int[] result = new int[2];
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < input.length; i++) {
int diffVal = (int) (target - input[i]);
if (map.containsKey(diffVal)) {
result[1] = i + 1;
result[0] = map.get(diffVal);
break;
}
map.put(input[i], i + 1);
}
return result;
}
总结,我们能学到什么:
- 简化需求以方便写代码实现,本例中变换表达式的形式后(如:2=11-9),就可以方便使用hashmap了
以上,您有任何问题或建议,请给我写邮件。