2021-05-04

1.两数之和(#1)
在这里插入图片描述

在这里插入图片描述

方法签名:
在这里插入图片描述

  • 最简单的方法可以使用暴力法进行两两组合与目标值进行一一对比,但是时间复杂度太高性能太低,在此不做实现
  • 方法一: 使用Hash表实现两数之和的求解
  • 思路:先将所有的数组的值作为key 数组的下标作为value映射到Map集合中,再进行数组的遍历(从前往后遍历数组的每一个元素是否存在一个值,使得当前元素值与map中保存的值之和等于目标值),使用Java语言进行实现
public int[] twoSum(int[] nums, int target) {
        //定义Map存储映射
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i],i);
        }
        //开始寻找map中的值
        for (int i = 0; i < nums.length; i++) {
            int temp = target-nums[i];
            if (map.containsKey(temp) && map.get(temp)!=i){
                //找到了
                return new int[]{i,map.get(temp)};
            }
        }
        //没找到
        throw new RuntimeException("没找到!!");
    }

测试性能优点太拉胯了
在这里插入图片描述

  • 前面这种的时间复杂度虽然只是O(n) 空间复杂度也为O(n)但是for了两次 能否实现一次for就搞定?(下面是优化后的代码)
 //方法2:
    public int[] twoSum2(int[] nums, int target) {
        //定义Map存储映射
        Map<Integer,Integer> map = new HashMap<>();
        //直接进行遍历寻找map中对应的值
        for (int i = 0; i < nums.length; i++) {
            int temp = target-nums[i];
            //先判断map中有没有  有直接返回 没有将这个值加入   这样就避免了两次for
            if (map.containsKey(temp)){
                return new int[]{map.get(temp),i};//注意这次的顺序  因为map中的在前属于从后往前找
            }
            map.put(nums[i],i);
        }
        throw new RuntimeException("没找到!!!");
    }

在这里插入图片描述

  • 下面这种方法虽然时间复杂度也为O(n),但是巧妙的只进行了一次for就搞定了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值