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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javaCalendar日期比较

    javaCalendar日期比较publicstaticvoidmain(String[]args)throwsException{StringstartTime=”2012-12-1212:45:45″;StringendTime=”2012-04-1212:45:40″;StringSYSendTime=”2012-11-1212:45:40″;SimpleDateForma…

    2022年5月10日
  • OpenCV-Python (Sobel算子)[通俗易懂]

    OpenCV-Python (Sobel算子)[通俗易懂]Sobel算子Sobel算子的基本概念Sobel算子是一个主要用于边缘检测的离散微分算子(discretedifferentiationoperator)。它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。在图像的任意一点使用此算子,都将会产生对应的梯度矢量或是其法矢量。原型Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Pyt…

    2022年7月14日
  • java 拦截器 判断url_Spring 的拦截器如何实现url转发

    java 拦截器 判断url_Spring 的拦截器如何实现url转发如何实现Spring的过滤器代码中改写请求的URL,并转发出去,注意,是转发,不是重定向packagecom.blog.inteceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.web.servl…

    2022年8月31日
  • 初次尝试使用VisualSFM记录

    初次尝试使用VisualSFM记录  对于SFM一直觉得高大上又神秘,一年前粗略的了解过一下,今年有时间尝试深入了解SFM,对于初学者来说,VisualSFM真的时非常好的感受SFM的免费软件,于是通过其他博客的指导(没去看官方的英文版,容易犯困),做了一个3D模型出来,感觉还挺好玩,记录一下。  实际上,VisualSFM只做了一部分工作,优化是用MeshLab做的,所以分两个环节:   1.VisualSF…

    2022年6月20日
  • 文件系统挂载、ext文件系统及read命令、Linux RAID、lvm应用「建议收藏」

    文件系统挂载、ext文件系统及read命令、Linux RAID、lvm应用

    2022年4月2日
  • STM32F407 + LAN8720A + LWIP 实现TCP服务器

    STM32F407 + LAN8720A + LWIP 实现TCP服务器STM32F407+LAN8720A+LWIP实现TCP客户端环境说明:开发板:某宝买的,STM32F407IGSTM32CUBEMX5.6HALLibVersion1.25(一)配置时钟(二)配置调试串口(三)配置以太网ETH(1)基础配置顺序依次说明:LAN8720A使用的是RMII接口进行配置寄存器自动重连使能MAC地址LAN8720A的物理地址(类似IIC的从设备地址),可配置为0或者1,由LAN8720A的RXER/PHYAD0引脚控制

    2022年6月17日

发表回复

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

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