给定一个数组和一个目标值,返回数组中两个相加等于该目标值元素的索引。
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
解法一:
package com.lipeng.leetcode;
import java.util.Arrays;
/**
* 实现思路:
* 没什么好说的,性能最差的方法,时间复杂度为O(n²)
* @author LiPeng
* @date 2018年1月24日
*/
public class TwoSumLc {
public static void main(String[] args) {
int[] arr={0,3,4,0};
int[] rsArr=TwoSumLc.twoSum(arr,0);
Arrays.stream(rsArr).forEach(System.out::println);
}
public static int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;++i){
for(int k=i+1;k<nums.length;++k){
if(nums[i]+nums[k]==target)
return new int[]{i,k};
}
}
return null;
}
}
解法二:
package com.lipeng.leetcode;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 实现思路:
* 先循环遍历一次数组,建立值与索引映射关系
* 然后遍历数组,target减去数组的值,去map里查询是否有符合条件的值
* @author Others
* @date 2018年1月24日
*/
public class TwoSumLc {
public static void main(String[] args) {
int[] arr={5,1,3,4,1,0};
int[] rsArr=TwoSumLc.twoSum(arr,2);
Arrays.stream(rsArr).forEach(System.out::println);
}
public static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
}