题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题1
简单粗暴,通过两边for循环,找到下标相同的值,记录下标后返回。该解法任何语言通用。
时间复杂度: O(n2)
运行时间 | 内存消耗 | 语言 |
---|---|---|
57 ms | 39.9 MB | Java |
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
for(int i = 0;i< nums.length-1;i++){
for(int j = i+1;j< nums.length;j++){
if(nums[i]+nums[j]==target){
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
}
解题2
这个思路和解法耗时太高,换个思路,借助于Map来求解;将值存入Map中,两个map值得key相加为target;利用hashmap快速查找特性,每次插入时,检查key是否存在;存在即为查找结果。
运行时间 | 内存消耗 | 语言 |
---|---|---|
3 ms | 40.1 MB | Java |
class Solution {
public int[] twoSum(int[] nums, int target) {
int indexs[] = new int[2];
Map numMap = new HashMap<Integer,Integer>();
for(int i = 0;i< nums.length;i++){
int temp = target-nums[i];
if(numMap.containsKey(temp)){
indexs[0] = (int)numMap.get(temp);
indexs[1] = i;
break;
}
numMap.put(nums[i],i);
}
return indexs;
}
}