1.两数之和
题目描述:给定一个整数数组 nums 和一个整数目标值 target ,请你在该数组中找出 和为目标值 的那 两个整数,并返回他们的数组下标。
可以假设每种输入只会对应一个答案,但是数组中同一个元素不能使用两遍。可以按任意顺序返回答案。
-
解法一:暴力解决。使用枚举法,两次循环遍历数组。时间复杂度为O(n^2),空间复杂度为O(1)
public static int[] getResult(int[] nums , int target) { int len = nums.length; for (int i = 0; i < len - 1; i++) { for (int j = i + 1; j < len; j++) { if (nums[i] + nums[j] == target) { return new int[]{i,j}; } } } return new int[]{-1,-1}; } //测试: public static void main(String[] args) { int[] num = {2,3,4,8,10}; int target = 11; int[] result = getResult1(num, target); System.out.println("和为目标值的那两个整数的下标为:"); System.out.println(result[0] + " " + result[1]); }
-
解法二:查找表法。使用哈希表来实现,遍历一次数组,时间复杂度O(n),空间复杂度O(n)。
public static int[] getResult2(int[] nums , int target){ Map<Integer, Integer> map = new HashMap<>(); int len = nums.length; for (int i = 0; i < len; i++) { int temp = target - nums[i]; if (map.containsKey(temp)) {//如果在哈希表中存在target - nums[i],就返回该值的下标和nums[i]的下标 return new int[]{map.get(temp), i}; } map.put(nums[i], i);//如果不存在,则将nums[i]添加到哈希表中 } return new int[]{-1,-1}; } //测试: public static void main(String[] args) { int[] num = {2,3,4,8,10}; int target = 11; int[] result = getResult2(num, target); System.out.println("和为目标值的那两个整数的下标为:"); System.out.println(result[0] + " " + result[1]); }