文章目录
- 算法练习
 - 题目
 - 思路
 - 参考答案
 - 算法1
 - 算法2
 - 算法3
 
算法练习
面试经常会遇到算法题目,今天开启算法专栏,常用算法解析
题目
**
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个
整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
**
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
 
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
 
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
 
 
思路
- 遍历数组中的每个元素。 对于每个元素,计算它与目标值的差值。 在数组中查找是否存在这个差值。 如果找到了,返回这两个元素的索引。
 - 使用哈希表:通过使用哈希表来存储已经遍历过的数字及其索引,我们可以在 O(1) 的时间内查找某个数字是否存在,从而将时间复杂度从 O(n^2) 降低到 O(n)。
减少不必要的循环:在找到第一个符合条件的数字对后,立即返回结果,避免了多余的循环。
更好的错误处理:在返回结果时,检查结果数组的长度,确保它包含两个索引,提高了代码的健壮性。 
参考答案
算法1
遍历for循环比较 nums[j] == target - nums[i]
   /**
     *
     * @param nums
     * @param target
     * @return
     */
    public static int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == target - nums[i]) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[]{}; // 没有找到符合条件的元素
    }
 
思考一下有更好的解法吗?
 当前时间复杂度为 O(N^2)
算法2
可以通过hash存入Key=value,value=索引的方式存储比较
关键代码
int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[]{(int) map.get(complement), i};
            } 
 
/**
     * 在整数数组中找到两个数,它们的和等于给定的目标值
     * 算法优化 O(n) 复杂度
     *
     * @param nums   整数数组
     * @param target 目标值
     * @return 包含两个数索引的整数数组,如果没有找到则返回空数组
     */
    public static int[] optimizedTwoSum(int[] nums, int target) {
        HashMap<Object, Object> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[]{(int) map.get(complement), i};
            } else {
                map.put(nums[i], i);
            }
        }
        return new int[]{}; // 没有找到符合条件的元素
    }
 
算法3
上面写完,还有一些细节需要补充
- 异常处理
 - map的初始值,内存优化
 - 首次不用遍历
 
 /**
     * 内存优化
     * @param nums
     * @param target
     * @return
     */
    public static int[] optimizedTwoSum2(int[] nums, int target) {
        int length = nums.length;
        // 初始化哈希表
        Map<Integer, Integer> map = new HashMap<>(length-1);
        map.put(nums[0], 0);
        for (int i = 1; i < length; i++) {
            int c = target - nums[i];
            if (map.containsKey(c)) {
                return new int[]{(int) map.get(c), i};
            } else {
                map.put(nums[i], i);
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }
 
执行结果
 



















