Java实现两数之和「建议收藏」

Java实现两数之和「建议收藏」给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。即:每个index上的数字只能用一次示例:给定nums=[2,7,11,15],target=9因为nums[0]+nums[1]=2+7=9所以返回[0,1]方法一:暴力法遍历每个元素x,并查找是否存在一个值与target…

大家好,又见面了,我是你们的朋友全栈君。

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。即:每个index上的数字只能用一次

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

1.方法一:暴力法

遍历每个元素x,并查找是否存在一个值与target−x相等的目标元素。

public 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 };
            }
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

2.方法二:两遍哈希表

一个简单的实现使用了两次迭代。在第一次迭代中,我们将每个元素的值和它的索引添加到表中。然后,在第二次迭代中,我们将检查每个元素所对应的目标元素(target−nums[i])是否存在于表中。注意,该目标元素不能是nums[i]本身!

public int[] twoSum(int[] nums, int target) { 
   
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) { 
   
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) { 
   
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) { 
   
            return new int[] { 
    i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

3.方法三:一遍哈希表

事实证明,我们可以一次完成。在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。

public int[] twoSum(int[] nums, int target) { 
   
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) { 
   
        int complement = target - nums[i];
        if (map.containsKey(complement)) { 
   
            return new int[] { 
    map.get(complement), i };
        }
        map.put(nums[i], i);
    }
    throw new IllegalArgumentException("No two sum solution");
}

本文参考:
https://leetcode-cn.com/problems/two-sum/solution/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130468.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月14日 上午10:46
下一篇 2022年6月14日 上午11:00


相关推荐

  • 在线词云制作tagxedo

    在线词云制作tagxedo最近在用 python 制作词云的时候发现了一个更加方便快捷很好玩的词云制作网站 http www tagxedo com app html 所以今天就来大致介绍下是怎么使用的 1 先来介绍下 tagxedo 的作用 借用官网的说法 Tagxedo 是一款可以自定义云的外形的文字云在线生成工具 可以把人物头像用单词或者文字来制作成词图样式 因为它不仅完美地支持中文 而且制作方法简单 易

    2026年3月19日
    2
  • Linux 常用的zip压缩和解压命令详解

    Linux 常用的zip压缩和解压命令详解前言  嗨,大家好,又与大家见面了,感谢大家在2021年的陪伴,让我们在2022年继续一路前行。相信很多小伙伴在使用Linux系统中经常对文件进行或者文件夹进行操作,不像在Windows中可以使用可视化的工具对文件和文件夹进行压缩和解压操作,那么本次与大家一起学习Linux下zip和unzip的压缩和解压命令,并熟悉常用的参数介绍。常用命令  相信很多对于有一定Linux基础的小伙伴,常用的压缩有:zip、unzip、tar、gzip、bzip2等常用的命令,下面开始zip和unzip使用方法和参数详

    2022年6月7日
    43
  • mysql自定义函数详解_mysqlinterval函数

    mysql自定义函数详解_mysqlinterval函数个人博客原文链接更多文章欢迎访问个人博客站点建定义函数的的基本语法如下–DELIMITER是用来设置边界符的DELIMITER//CREATEFUNCTION函数名(形参列表)RETURNS返回类型begin–函数体RETURNEND//DELIMITER;创建日期时间格式化函数DROPFUNCTIONIFEXISTS`FORMAT_DATE_TIME`;CREATE…

    2025年10月1日
    4
  • TCP和UDP的区别是什么_socket tcp udp区别

    TCP和UDP的区别是什么_socket tcp udp区别TCP/IP协议栈主要分为四层:应用层、传输层、网络层、数据链路层,每层都有相应的协议,如下图IP:网络层协议;(高速公路)TCP和UDP:传输层协议;(卡车)HTTP:应用层协议;(货物)。HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。SOCKET:套

    2026年2月1日
    5
  • asp数组使用

    asp数组使用数组的定义 DimMyArrayMy Array 1 5 123 12 98 可扩展数组 DimMyArray fori 0to10ReDimPr i MyArray i inext 将一个字符串分割并返回分割结果的数组 DimMyArrayMy Split

    2026年3月16日
    1
  • 智谱GLM-4.6V开源:不仅仅是“看懂”,它终于长出了“双手”

    智谱GLM-4.6V开源:不仅仅是“看懂”,它终于长出了“双手”

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号