给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。git
你能够假设每种输入只会对应一个答案。可是,你不能重复利用这个数组中一样的元素。github
示例:数组
给定 nums = [2, 7, 11, 15], target = 9 由于 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]
我首先想到的也是暴力解决的办法,出现了两次问题,1.没有设置默认值,2.第二个for循环的length-1了code
/** * @Author : Yanqiang * @Date : 2019/5/24 * @Param : [nums, target] * @return : int[] * @Description : 两数之和, ---暴力运算 */ public static int[] twoSum1(int[] nums, int target) { //定义默认返回值 int[] result = {0,0}; for (int i = 0; i<nums.length; i++){ //目标值a = 两数之和 - 当前值 int a = target - nums[i]; //从当前值日后循环,好比{2, 7, 11, 15};i为2,就从7开始查 for (int k = i+1; k<nums.length; k++){ //若是nums[k] = 目标值a,说明找到了 if (nums[k] == a){ result[0] = i; result[1] = k; } } } return result; } /** * @Author : Yanqiang * @Date : 2019/5/24 * @Param : [nums, target] * @return : int[] * @Description : 两数之和, ---HashMap匹配 */ public static int[] twoSum2(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { //目标值a = 两数之和 - 当前值 int a = target - nums[i]; //若是HashMap包含目标值 a=nums[i] ,说明找到了 if (map.containsKey(a)) { return new int[] { map.get(a), i }; } //若是没有重复的,HashMap存放的是Map<当前值, 当前值的数组下标> map.put(nums[i], i); } throw new IllegalArgumentException("No two sum solution"); }
public static void main(String[] args) { //int[] nums = {3,2,4}; int[] nums = {2, 7, 11, 15}; System.out.println(Arrays.toString(twoSum2(nums, 9))); }
LeetCode 所有解答题目,可移步 GitHub:https://github.com/yan-qiang/LeetCodeip