Leetcode - 1. 两数之和

解题思路参考代码中的注释:
class Solution {

    // 以测试用例 nums = [2,7,11,15], target = 9 为例,要找到答案,就需要遍历数组
    // 第一个元素为2,那么我们自然想知道数组中是否有元素7(即2的补数);如果有,它对应的下标是多少
    // 如何找到补数?最简单的方法是暴力法,直接再遍历一遍数组,查看补数是否存在
    // 也可以将数字作为键、对应的下标作为值存入map中,然后通过其get()方法找某个数字在原数组中的下标
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;

        // historyMap用于存储已经遍历过的元素及其对应的下标
        Map<Integer, Integer> historyMap = new HashMap<>(len << 1);
        
        // 遍历数组中的元素
        for(int i = 0; i < len; i++){
            int num = nums[i];

            // 如果能在历史记录里找到补数,则直接返回当前下标与补数的下标
            Integer complementIndex = historyMap.get(target - num);
            if (complementIndex != null) {
                return new int[] {complementIndex, i};
            }
            
            // 否则将当前数与下标存到历史记录表中
            historyMap.put(num, i);
        }

        // 题目说有且只有一个答案,所以一定不会执行到这里
        return new int[0];
    }
}
全部评论

相关推荐

鲸鸿:实习协议不用管签多久,要走的时候提前三天说就可以了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务