算法——两数之和(leetcode1)梦开始的地方

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

对于leetcode的这第一道题刚开始刷算法时看见题目不就是计算两个数的和吗还是简单题看我不kuchikuchi拿下10min~(嗯,有点意思)30min(好像有点难度哈)2h~(这题不做也罢!)开玩笑[狗头],但确实初入算法的世界这第一道题就将我难住了随后也吭哧吭哧用暴力解法解了出来但感觉好累啊算法好难学啊,直至今天重新拾起信心学习算法刷起算法题才领悟到算法的奥妙;

分析题意可知我们选定一个数组元素时要再找到另一个不重复的元素两者之和要等于target并返回两个元素的下标由此除了暴力解法我们还可以想到Map<key,value>的数据结构来存储元素key存储元素的值value存储元素的下标那么当我们遍历给定数组时只需要在Map中找到target-当前遍历的数组元素即可(同一元素不能重复使用)如果在Map中命中返回当前遍历的数组元素下标与Map的值即可

自己的解法(先将数组元素全部存储至Map中再索引Map并判断)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> record = new HashMap();
        int[] res = new int[2];
        for (int i = 0; i < nums.length; i++) {
            record.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++) {
            int num = target - nums[i];
            if (record.containsKey(num)&&i!=record.get(num)) {
                res[0] = i;
                res[1] =record.get(num);
                return res;
            }
        }
        return res;
    }
}

优质解法(边判断Map是否命中如果未命中则放入Map如果命中则返回对应下标)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> record = new HashMap();
        for (int i = 0; i < nums.length; i++) {
            int num = target - nums[i];
            if(!record.containsKey(num))
            record.put(nums[i],i);
            else return new int[]{i,record.get(num)};
        }
        return null;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值