🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
:-: 2.1 两数之和 * * * * * **题干:** 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 示例: ~~~ 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] ~~~ **题目分析:** 可以哈希解,可以暴力破解,可以由找a + b = c 转为找 c - a = b; **新手有可能遇到的解题思路陷阱:** 无 **解题思路分析以及代码实现:** 第一种思路:暴力破解。由找a + b = c 转为找 c - a = b就不写了,自行扩展。 第一种思路代码: ~~~ public static int[] twoSum(int[] nums, int target) { int num[] = 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) { num[0] = i; num[1] = j; break; } } } return num; } ~~~ **复杂度分析** 时间复杂度:O(n^2)。 空间复杂度:O(1)。 第二种思路:哈希 第二种思路代码: ~~~ public static int[] twoSum(int[] nums, int target) { //将值,位置转换为key value存储 HashMap<Integer, Integer> table = new HashMap<>(); int[] result = new int[2]; for (int i = 0; i < nums.length; i++) { if (table.get(target - nums[i]) != null) { result[0] = table.get(target - nums[i]); result[1] = i; break; } table.put(nums[i], i); } return result; } ~~~ 异曲同工的代码:有的小伙伴或许会疑惑,为什么方法的最后没return,终止方法的众多方法中的两种简单的就是,return,抛出异常。而且这里如果执行到最后还没找到结果(虽然平台都不会这么无聊),返回不相干的数组肯定是不合适的,所以我们可以抛异常来终止程序。 ~~~ 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"); } ~~~ **复杂度分析** 时间复杂度:O(n)。 空间复杂度:O(n)。 **若有理解错误的、写错的地方、更好的思路,方法,望各位读者评论或者发邮件指正或指点我,不胜感激。**