`

每日一个小算法之两数之和

 
阅读更多

每日一个小算法之两数之和

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1].

这个题目是不是很简单啊。

本文出自凯哥Java(kaigejava)

首先,我们想到的第一种方案就是for循环。嵌套循环。如下:

JAVA代码:

public static void main(String[] args) {
    Integer [] nums  = new Integer []{1,2,0,5,7,9,3};
    Integer target  = 5;
    Integer[] returnNums  = twoSum(nums,target);
    System.out.println(JSON.toJSONString(returnNums));
}
public static Integer[] twoSum(Integer[] nums, Integer target) {
    Integer[] returnNums = new Integer[2];
    for (int i = 0; i < nums.length; i++) {
        for (int j = i+1; j < nums.length; j++) {
            int num1 = nums[i];
            int num2 = nums[j];
            if ((num1 + num2) == target) {
                returnNums[0] = i;
                returnNums[1] = j;
                return returnNums;
            }
        }
    }
    return returnNums;
}

运行结果:

a31f9d367f105622468728959fd40c1b.png

执行结果是出来了。我们看看执行时间:

f4976f9f42f0a8dd4ecd8a43b8f16206.png

是不是很low的一种方法。

那么接下来,我们看看第二中算法:

第二种算法和巧妙。Java代码如下:

private  Integer[] twoSum2(Integer[] nums, Integer target) {
    Integer[] indexs = new Integer[2];
    // 建立k-v ,一一对应的哈希表
    HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
    for(int i = 0; i < nums.length; i++){
        if(hash.containsKey(nums[i])){
            indexs[0] = i;
            indexs[1] = hash.get(nums[i]);

            log.info(JSON.toJSONString(hash));
            return indexs;
        }
        // 将数据存入 key为补数 ,value为下标
        hash.put(target-nums[i],i);
        log.info("==>:{},i=:{},target-nums[i]:{}",nums[i],i,target-nums[i]);
    }
    return indexs;
}

其中巧妙的地方:

f26ec04957bb6939f2b89a7cade76b66.png

再来看看运行结果:

c17fb7dfbe2227becc7db56d498be764.png

看看两个算法对比:

231c56bcd07165cfe6239de7adce2ded.png

再速度上是不是快了很多。

欢迎大家留下更好的算法。一起学习,一起成长

分享到:
评论

相关推荐

    用MD5算法创建6位数字密码

    由于MD5的这种特性,它常用于数据完整性的校验和密码存储,尽管现在已知MD5存在碰撞问题,即两个不同的输入可能会得到相同的MD5值,但这并不影响在我们的场景中使用,因为我们关注的是密码的每日变化而非绝对不可...

    LeetCode每日一题高频面试算法题目1

    我们可以使用两个指针,分别指向两个数组的当前元素,然后将较小的元素添加到结果数组中,直到其中一个数组结束。这种方法的时间复杂度为 O(n),空间复杂度为 O(1)。 本资源提供了多种算法题目,涵盖了队列实现栈、...

    算法每日一题.docx

    "算法每日一题" 以下是根据给定文件信息生成的相关知识点: 一、算法编程大题 1. 手串艺人的问题:这个问题考察了字符串匹配和环形结构的处理能力。需要判断手串上的颜色是否符合要求,即任意一种颜色在任意连续...

    C语言经典算法大全.pdf

    且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。 费式数列(Fibonacci Sequence)是1200年代的欧洲数学家Leonardo Fibonacci在...

    数据结构算法

    经典算法题每日演练——第四题 最长公共子序列 经典算法题每日演练——第三题 猴子吃桃 经典算法题每日演练——第二题 五家共井 经典算法题每日演练——第一题 百钱买百鸡 开发利器系列(1)介绍一个小工具 ...

    关于商品推荐推荐算法

    竞赛的评估标准是通过计算预测的(用户数-品牌数)对的准确率和召回率来得到算法成绩F1-SCORE。准确率是指预测正确的用户-品牌对在所有预测中的比例,召回率是指预测正确的用户-品牌对在实际所有购买品牌对中的比例...

    helloalgorithm:每日算法

    通过"helloalgorithm:每日算法"项目,开发者可以系统地学习和实践这些算法,逐步建立起扎实的算法基础,从而在解决实际问题时更加游刃有余。不断积累和练习,将使你在面对复杂编程挑战时更加自信,成为真正的Java...

    蓝桥杯ACM算法比赛模拟题30天每日训练.zip

    "蓝桥杯ACM算法比赛模拟题30天每日训练.zip"这个压缩包文件是针对蓝桥杯ACM算法比赛的训练资源,旨在帮助参赛者进行为期30天的日常练习,以提升他们的编程和算法解决能力。蓝桥杯是一项国内知名的编程竞赛,主要考察...

    恋爱话术微信小程序源码,包含每日推荐情话和恋爱话术.zip

    3. 情话推荐算法:为了实现每日推荐功能,可能需要一种算法来决定哪条情话会在特定日期显示。这可以是简单的随机选择,也可以基于用户喜好、历史查看记录等复杂策略。 4. 用户界面设计:为了让用户体验流畅且吸引人...

    乒乓球比赛比赛分组算法

    对于超过2的参赛者数量,则通过递归方式分为两个小组,并分别对这两个小组应用同样的算法。 4. **配对规则**:在递归过程中,通过调整数组元素的方式,确保每个选手每天都有比赛,并且每两天内不重复对手。 5. **...

    LN2000分散控制算法手册 第六部分 时间功能算法块.doc

    每种模式都有特定的逻辑顺序图和特性描述,如基本定时器在Set信号变为1后,经过设定时间后,DO输出一个运算周期的脉冲;而滞后置位型定时器在Set信号变为1并保持超过设定时间后,DO才会变为1。 2. 定时器优化算法块...

    基于MapReduce框架一种文本挖掘算法的设计与实现

    例如,“2维词组”指的是由两个相邻单词组成的组合,这是算法处理的基本单元。通过对这些词组的统计与排序,算法能够揭示文本数据中隐藏的词汇共现模式,为用户提供深度洞察和分析依据。 #### 实验结果与分析 实验...

    基于供应链管理的一种采购算法研究

    总结来说,这篇研究探讨了一种基于供应链管理的采购算法,利用马尔科夫决策过程和动态规划来优化库存水平和总成本。这种方法通过综合考虑价格、需求、供应商反馈和库存成本,帮助企业做出更明智的采购决策,以应对多...

    [LeetCode]每日一题509:斐波那契数.docx

    这个代码使用了迭代算法,使用两个变量 per1 和 per2 来存储前两个数字的和,最后返回 per2 作为结果。这个算法的执行效率远远高于递归算法。 在解决这个问题时,我们需要注意以下几点: 1. 仔细分析问题的特点和...

    每日一道算法面试题(1):leetcode1两数之和

    两数之和 题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素...

    leetcode算法(每日一题).pdf

    自己总结的leetcode新人必刷30题 含详细注解

    随机生成每日菜单微信小程序

    本项目“随机生成每日菜单微信小程序”便是一个利用微信小程序平台,结合数据存储和随机算法,为用户提供便捷的日常菜单规划的小工具。以下是关于该项目的技术细节和实现方法。 首先,我们关注到“使用微信...

    一种面向科技文献元数据增量数据规范的多模式匹配算法.docx

    这类算法旨在一次性扫描识别出多个模式串在给定字符串中的位置。 多模式匹配算法主要分为三类:基于有限状态自动机(FSA)的算法,如Aho-Corasick(AC)算法;基于Hash散列的算法,如Wu-Manber(WM)算法;以及其他...

Global site tag (gtag.js) - Google Analytics