当前位置: 首页 > news >正文

LeetCode01 - 两数之和(Java 实现)

LeetCode01 - 两数之和

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

题目描述

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

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

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

Java 实现与实现思路

import java.util.HashMap;

/**
 * <p>
 * 01:两数之和
 * 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
 * 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
 * </p>
 *
 * @since 2019-07-14
 * @author XiaoPengwei 
 */
public class LeetCode01TwoSum {

    public static void main(String[] args) {

        int[] testArr = {2, 7, 10, 32, 21};
        int target = 9;

        System.out.println("--> the method 1");
        int[] ints1 = method1(testArr, target);
        for (int i1 : ints1) {
            System.out.println(i1);
        }

        System.out.println("--> the method 2");
        int[] ints2 = method2(testArr, target);
        for (int i2 : ints2) {
            System.out.println(i2);
        }

        System.out.println("--> the method 3");
        int[] ints3 = method3(testArr, target);
        for (int i3 : ints3) {
            System.out.println(i3);
        }
    }

    /**
     * 方法一:暴力法
     * 两层循环。外层先拿出左侧第 1 个元素,内层依次判断右侧其余元素与它的和如果等于目标值则返回,如果不等于则继续下一个,如果全部遍历完不存在则抛出异常。
     *
     * @param nums 数组
     * @param target 和
     * @return int[] 下标数组
     */
    public static int[] method1(int[] nums, int target) {

        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] + nums[i] == target) {
                    return new int[]{i, j};
                }
            }

        }
        throw new IllegalArgumentException("Method1: No two sum solution");
    }

    /**
     * 方法二:用 Hash 表
     * (1)构造一个哈希表,key 是所有待选数组元素,value 是数组下标;
     * (2)然后从左向右遍历,对于元素 i,判断 target - nums[i] 是否包含在哈希表中,如果存在则拿出下标,如果不存在则继续。
     *
     * @param nums 数组
     * @param target 和
     * @return int[] 下标数组
     */
    public static int[] method2(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if (map.containsKey(temp) && map.get(temp) != i) {
                return new int[]{i, map.get(temp)};
            }
        }

        throw new IllegalArgumentException("Method2: No two sum solution");
    }

    /**
     * 方法三:用 Hash 表
     * 可以不单独构造哈希表。这样显然在第一个元素时,不可能匹配。为什么这样也可以呢?
     * 其实上面我们程序结束的条件是对 2,查找是否包含 7。而这里是对 7,查找包含 2。同样可以实现。
     *
     * @param nums 数组
     * @param target 和
     * @return int[] 下标数组
     */
    public static int[] method3(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if (map.containsKey(temp)) {
                return new int[]{
                        map.get(temp), i};
            }
            map.put(nums[i], i);
        }

        throw new IllegalArgumentException("Method3: No two sum solution");
    }
}

相关文章:

  • LeetCode02 - 两数相加(Java 实现)
  • LeetCode03 - 无重复字符的最长子串(Java 实现)
  • Idea 获取 git 仓库时更新类型update type 的选择
  • Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP
  • 8080 端口被占用的解决方法 netstat -ano;taskkill (命令行)
  • 手写 Spring MVC
  • Oracle 在 Drop 表时的 Cascade Constraints
  • Oracle:ORA-01219:database not open:queries allowed on fixed tables/views only
  • MyBatis: Invalid bound statement (not found) 错误的可能原因
  • Git 删除已经 Push 的远程文件夹或文件的命令方法
  • 写给自己 - 开发路上
  • ubuntu 18 自带截图工具 - 快捷键
  • svn 必须会敲的常用命令
  • ubuntu 18 解锁文件目录(谨慎操作)
  • ubuntu 18 安装 navicat Premium 中文乱码(很彻底)
  • 0基础学习移动端适配
  • 5、React组件事件详解
  • HTML5新特性总结
  • React Transition Group -- Transition 组件
  • RxJS: 简单入门
  • SOFAMosn配置模型
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 利用jquery编写加法运算验证码
  • 前端知识点整理(待续)
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何利用MongoDB打造TOP榜小程序
  • 实习面试笔记
  • 使用Swoole加速Laravel(正式环境中)
  • 用Canvas画一棵二叉树
  • No resource identifier found for attribute,RxJava之zip操作符
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • k8s使用glusterfs实现动态持久化存储
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (33)STM32——485实验笔记
  • (C#)一个最简单的链表类
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)Mysql的优化设置
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .apk 成为历史!
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Core中Emit的使用
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net反编译的九款神器
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @SentinelResource详解
  • [100天算法】-二叉树剪枝(day 48)
  • [BSGS算法]纯水斐波那契数列
  • [BZOJ3757] 苹果树
  • [docker]docker网络-直接路由模式
  • [go] 迭代器模式