给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法1:
简单直接,暴力搜索,时间复杂度是O(n^2);
class Solution {
public int[] twoSum(int[] nums, int target) {
int n=nums.length;
int sum[]=new int[2];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(nums[i]+nums[j]==target){
sum[0]=i;
sum[1]=j;
return sum;
}
}
}
return sum;
}
}
解法2:
使用map,把算法时间复杂度降为O(n) ,a+b=c ;a = c - b; 题目说明数组元素不会重复。Map的key为数组中的值,map的value为数组下标。当前数组是a时只需要找到key为b的值即可。(这算法值得好好想想)
public int[] twoSum(int[] nums, int target) {
int[] sum = new int[2];
Map<Integer,Integer> map = new HashMap<>(nums.length);
for (int i = 0; i < nums.length; i++) {
int value = target-nums[i];
Integer index = map.get(value);
if (index != null && index != i) {
sum[0] = i;
sum[1] = index;
break;
}
map.put(nums[i],i);
}
return sum;
}
BB一句:
注意时间复杂度。。。。
网友评论