首页 > 编程语言 >【Leetcode算法面试题】-1. 两数之和

【Leetcode算法面试题】-1. 两数之和

时间:2024-09-09 19:49:32浏览次数:14  
标签:map 面试题 return target nums int 算法 Leetcode 两数

文章目录

算法练习

面试经常会遇到算法题目,今天开启算法专栏,常用算法解析

题目

**

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个
整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

**

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

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]
 

思路

  • 遍历数组中的每个元素。 对于每个元素,计算它与目标值的差值。 在数组中查找是否存在这个差值。 如果找到了,返回这两个元素的索引。
  • 使用哈希表:通过使用哈希表来存储已经遍历过的数字及其索引,我们可以在 O(1) 的时间内查找某个数字是否存在,从而将时间复杂度从 O(n^2) 降低到 O(n)。
    减少不必要的循环:在找到第一个符合条件的数字对后,立即返回结果,避免了多余的循环。
    更好的错误处理:在返回结果时,检查结果数组的长度,确保它包含两个索引,提高了代码的健壮性。

参考答案

算法1

遍历for循环比较 nums[j] == target - nums[i]

   /**
     *
     * @param nums
     * @param target
     * @return
     */
    public static int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == target - nums[i]) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[]{}; // 没有找到符合条件的元素
    }

思考一下有更好的解法吗?
当前时间复杂度为 O(N^2)

算法2

可以通过hash存入Key=value,value=索引的方式存储比较

关键代码

int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[]{(int) map.get(complement), i};
            } 
/**
     * 在整数数组中找到两个数,它们的和等于给定的目标值
     * 算法优化 O(n) 复杂度
     *
     * @param nums   整数数组
     * @param target 目标值
     * @return 包含两个数索引的整数数组,如果没有找到则返回空数组
     */
    public static int[] optimizedTwoSum(int[] nums, int target) {
        HashMap<Object, Object> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[]{(int) map.get(complement), i};
            } else {
                map.put(nums[i], i);
            }
        }
        return new int[]{}; // 没有找到符合条件的元素
    }

算法3

上面写完,还有一些细节需要补充

  • 异常处理
  • map的初始值,内存优化
  • 首次不用遍历
 /**
     * 内存优化
     * @param nums
     * @param target
     * @return
     */
    public static int[] optimizedTwoSum2(int[] nums, int target) {
        int length = nums.length;
        // 初始化哈希表
        Map<Integer, Integer> map = new HashMap<>(length-1);
        map.put(nums[0], 0);
        for (int i = 1; i < length; i++) {
            int c = target - nums[i];
            if (map.containsKey(c)) {
                return new int[]{(int) map.get(c), i};
            } else {
                map.put(nums[i], i);
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }

执行结果
在这里插入图片描述

标签:map,面试题,return,target,nums,int,算法,Leetcode,两数
From: https://blog.csdn.net/qq_41791705/article/details/142067239

相关文章

  • 24暑假算法刷题 | Day41 | 动态规划 IX | LeetCode 188. 买卖股票的最佳时机 IV,309.
    目录188.买卖股票的最佳时机IV题目描述题解309.买卖股票的最佳时机含冷冻期题目描述题解714.买卖股票的最佳时机含手续费题目描述题解188.买卖股票的最佳时机IV点此跳转题目链接题目描述给你一个整数数组prices和一个整数k,其中prices[i]是某支给定......
  • mybatis常见面试题
    mybatis常见面试题#{}和${}的区别是什么?Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;能够防止sql注入.Mybatis在处理\({}时,就是把\){}替换成变量的值。mybatis的一级缓存和二级缓存https://www.bilibili.com/video/BV1sM4m1f7L1/?......
  • LLM面试题汇总
    LLM相关LLM基础zeroshot、oneshot、threeshot是什么zeroshot:零样本学习。对于模型没有见过的图像,通过已有的图像和特征相关联,从而判别新的图片fewshot:少样本学习。通过判断测试样本与训练样本的相似性,来推测测试样本属于什么类bf16和fp16有什么区别LLM微......
  • LeetCode 239. 滑动窗口最大值(滑动窗口)
    题目:239.滑动窗口最大值思路:用一个双端队列来保存滑动窗口内的值按大到小排序,时间复杂度0(n)。细节看注释classSolution{public:vector<int>maxSlidingWindow(vector<int>&nums,intk){ //元素值是nums的下标,满足nums值按大到小排序deque<in......
  • 2025秋招计算机视觉面试题(十二) -理清深度学习优化函数发展脉络
    问题深度学习中有很多优化函数,常见的那些你还记得它的定义以及优缺点吗?背景知识深度学习网络训练中,有很多可供选择的优化函数如SGD、Adam等等,到底用哪个好呢?其实这个问题没有确切的答案,优化函数是需要配合损失函数使用的,说白了,优化函数也是一种超参数,是需要尝试的,哪个效......
  • [LeetCode] 2181. Merge Nodes in Between Zeros
    Youaregiventheheadofalinkedlist,whichcontainsaseriesofintegersseparatedby0's.ThebeginningandendofthelinkedlistwillhaveNode.val==0.Foreverytwoconsecutive0's,mergeallthenodeslyinginbetweenthemintoasing......
  • LeetCode 刷题—集合
    一:集合1、特点:元素没有顺序;不重复2、集合可以用来检擦某个元素是否存在;或者检查是否从在重复的元素3、常见的操作:#创建集合my_set={1,2,3,4,5}#添加元素my_set.add(6)#访问元素(集合是无序的;不能通过下标索引访问元素;只能通过遍历访问元素)foriinmy_set:print(i)#......
  • 0906, 0909 shell编程与基础算法(leetCode )
    0906哈希表的基本知识:哈希表(HashTable)又称散列表,是除顺序存储结构、链式存储结构和索引表存储结构之外的又一种存储结构。哈希碰撞:解决办法开放定址法:是一类以发生冲突的哈希地址为自变量,通过某种哈希冲突函数得到一个新的空闲的哈希地址的方法。(1)线性探测法从发生......
  • LeetCode刷题笔记9.2-9.9
    leetCode刷题笔记(9.2-9.9)48.旋转图像(9.3)1)图像即二维数组,图像的旋转本质上是二维数组的旋转变换2)二维数组从外层来看,是若干个子数组的集合,子数组内部维护各自的元素,即若干个row里是row.length个column3)由此可理解下面几个关于二维数组的函数:创建二维数组并初始化int[][]......
  • 【JavaScript】LeetCode:16-20
    文章目录16无重复字符的最长字串17找到字符串中所有字母异位词18和为K的子数组19滑动窗口最大值20最小覆盖字串16无重复字符的最长字串滑动窗口+哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新......