LetCode题练习

文章目录

  • 1 两数之和

1 两数之和

https://leetcode-cn.com/problems/two-sum/description/

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

两遍哈希表

    /**
     * 两边哈希表
     * 第一遍将数组存入Map中
     * 第二遍,通过判断差值是否存在于map中,来进行判断
     * 时间复杂度O(N):n个元素遍历两次
     * 空间复杂度O(N):取决于存入Map的数据
     * @param nums
     * @param target
     * @return
     */
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        //将数组全部存入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];//获取差值
            //通过map.containsKey判断值是否存在
            //通过map.get()获取值,并且按照要求,不能重复利用,即!=i
            if (map.containsKey(complement) && map.get(complement) != i){
                return new int[]{i, map.get(complement)};//返回对应的数
            }
        }
        throw  new IllegalArgumentException("No two sum solution");
    }

一遍哈希表

 /**
     * 一遍哈希表
     * 通过检查map中是否已经存在当前元素对应的目标元素
     * 如target = 9
     * {2,4,6,7}数组,第一次遇到2的时候并未存在,而是直接存入map。
     * 当遇到7的时候,此时map中已经存在2了,则返回。
     * 且这样做无需再考虑重复使用问题
     * 时间复杂度:O(N) 遍历一次
     * 空间复杂度:O(N) 取决于存入map中的数据
     * @param nums
     * @param target
     * @return
     */
    public int[] twoSum2(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i< nums.length; i++){
            int complement = target - nums[i];//获取差值
            //判断是否包含差值
            if (map.containsKey(complement)){
                return new int[]{i, map.get(complement)};//返回对应的数
            }
            //存入到map中
            map.put(nums[i], i);
        }
        throw  new IllegalArgumentException("No two sum solution");
    }

你可能感兴趣的:(算法结构与算法)