leetcode-1 俩数之和
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
-
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
解题思路
解法一:
-
为了保证没俩个数都能进行相加,所以通过俩次for循环让第二层的for循环的起始值始终比第一层大1
-
如果找到了就需要一个新的数组返回对应的数组下标,所以需要声明一个新的数组,去保存满足条件的数组下标
-
实现代码
class Solution { public int[] twoSum(int[] nums, int target) { int []a = 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){ a[0] = i; a[1] = j; return new int[] {i,j}; } } } return null; } }
解法二:
这个是百度看到的方法,用hashmap做的,下面分析一下具体过程
-
具体思路:先通过目标值target与数组中的值作差看得到的结果是否存在于hashmap中,如果存在,通过get方法得到键值(对应的元素值)对应数组中该值对应的下标,得到返回结果;如果不存在,则将对应的数组元素和其对应的下标存入map中去。(数组的值位key,下标为value)
-
先声明一个hashmap,用于存储数组中元素的值和下标
-
将目标值与数组中的元素分别作差并通过containsKey方法判断在hashmap中是否存在对应的键值,若存在通过get方法获取对应的下标值value,若不存在将数组元素和下标通过put方法存入hashmap
-
实现代码
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map = new HashMap<>(); for(int i = 0;i < nums.length ;i++){ int index = target - nums[i]; if(map.containsKey(index)){ return new int[] {map.get(index),i}; }else{ map.put(nums[i],i); } } return null; } }