两数之和
题目:给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。
- 暴力求解,双重for循环
class Solution { public int[] twoSum(int[] nums, int target) { int i; int j; int k[] = new int[2]; for( i = 0 ; i < nums.length;i++){ for( j = i+1; j < nums.length ; j++){ if(target == nums[i] + nums[j] ){ k[0] = i; k[1] = j; break; } } } return k; } }
- 使用map
class Solution { public int[] twoSum(int[] nums, int target) { int[] indexs = new int[2]; if(nums == null && nums.length >= 0){ return indexs; } Map<Integer,Integer> map = new HashMap<>(); for(int i = 0;i < nums.length;i++){ int temp = target - nums[i]; if(map.containsKey(temp)){ indexs[0] = i; indexs[1] = map.get(temp); } map.put(nums[i],i); } return indexs; } }
解释一下使用map的情况
创建数组用来存储符合条件的两数的数组下标,判断数组是否为空,如果为空直接返回。创建Map对象,遍历数组,轮流遍历获取到每个与与目标值的差值,并将这个差值作为key去map集合中查找。两种情况:如果有就将遍历到的值的下标、和差值作为key所查找到的value值存储到结果数组。如果没有值就将所遍历到的值作为key存储到map集合中,做到数的重复利用。
循环只进行了一次,时间复杂度只有n。