LeetCode-1-两数之和

题目描述

在这里插入图片描述

解决思路

本题很简单,只要使用双重循环,就可以解决,但是双重循环执行时间长,复杂度高,不推荐。
我们可以使用循环+map的方式来解决此问题
假设

int[] nums = new int[]{9,-3, 4, 3, 90};
int target = 0;

分析:
很明显在上述示例中 -3和3 这两项符合要求。有没有办法循环到3时,找到-3及其下标呢?我们把这个-3当做key,把下标当做value存到存到map中,是不是就可以了?
想像一下,当循环到3时,数组下标=3,map={9=0, -3=1, 4=2},那么我们只需判断map.containsKey(-3)是否为true就行。

解决方案—循环+map

    public static void main(String[] args) {
        int[] nums = new int[]{9,-3,4,3,90};
        int target = 0;
        int[] result = twoSum(nums, target);
        System.out.println(Arrays.toString(result));
    }
    // 关键思路:第一个数=总数-第二个数,我们先把第一个数作为key,下标作为value存到map中,
    // 当循环到第二个数时,我们只需判断map.containsKey(总数-第二个数)是否为true即可
    public static int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        // 存储数组的值和下标
        Map<Integer, Integer> map = new HashMap<Integer,Integer>(nums.length);
        // 第一项不用循环,可以先放到map中
        map.put(nums[0],0);
        // 从第二项开始循环
        for(int i=1;i<nums.length;i++){
            // 判断map中是否存在第一个数
            if(map.containsKey(target-nums[i])){
                // map中存在第一个数,第一个数的下标为value
                result[0] = map.get(target-nums[i]);
                // 第二个数的下标就是i
                result[1] = i;
                break;
            }
            map.put(nums[i],i);
        }
        return result;
    }

示例代码的运行结果为
在这里插入图片描述

下图为力扣的运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值