问题描述:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
解决方法:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] returnValue = {0, 0};
HashMap<Integer, Integer> values = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int value = target - nums[i];
if (values.containsKey(value)){
returnValue[0] = Math.min(i, values.get(value));
returnValue[1] = Math.max(i, values.get(value));
return returnValue;
}
values.put( Integer.valueOf(nums[i]), i );
}
return returnValue;
}
}
思路分析:
1.给一个数组与一个目标值,要求在数组中找到唯一的两个值相加等于目标值的索引。
2.传统思想:在空间上想象两个数组,然后挨个进行比较,相加值为target时返回其索引,但此题要求不能用相同的属性值两次,且此方法的时间复杂度为O(n^2),不符合。
3.改进思想:设置一个当前存储空间values ,其用HashMap存储已查找过的值i和其索引,key为真实值,value为索引。将values 中的key值 与 目标值-当前遍历的值 比较,若没有则将当前遍历的值与索引存储进values;若有则返回values中的value索引值和当前遍历的索引值i。这样不用遍历一次,时间复杂度为O(n),大幅度提高时间效率。
结果为:
Time Submitted | Status | Runtime | Memory | Language |
---|---|---|---|---|
a few seconds ago | Accepted | 3 ms | 39.4 MB | java |