Java实现LeetCode(1.两数之和)

Java实现LeetCode(1.两数之和)

一、题目描述

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,并且同样的元素不能被重复利用。

示例:

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

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

二、思路分析

1.暴力法

最容易想到的思路是循环每个数,并查找是否存在与其配对的目标元素。我们可以通过嵌套循环的方式来简单实现:

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

复杂度分析:

  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)

2.哈希表法

通过使用哈希表,我们可以将寻找目标元素的时间从 O(N) 降低到 O(1)。使用哈希表的时候,需要遍历一次数组并将每个元素及其下标添加到哈希表中,然后遍历一次数组并查找其目标元素是否存在于哈希表中。

public static 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");
}

复杂度分析:

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)

三、完整代码

import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static 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");
    }

    public static void main(String[] args) {
        int[] nums = {2, 7, 11, 15};
        int target = 9;
        int[] result = twoSum(nums, target);
        System.out.println(result[0] + " " + result[1]);
        // 输出:0 1
    }
}

四、两条示例说明

1.输入数组无解

若给定数组为 [1, 2, 3, 4],目标元素为 9,无解。

public static void main(String[] args) {
    int[] nums = {1, 2, 3, 4};
    int target = 9;
    try {
        int[] result = twoSum(nums, target);
        System.out.println(result[0] + " " + result[1]);
    } catch (Exception e) {
        System.out.println(e.getMessage());
        // 输出:No two sum solution
    }
}

2.数组中存在相同元素

若给定数组为 [2, 2, 3, 4], 目标元素为 4,返回 [0, 1]

public static void main(String[] args) {
    int[] nums = {2, 2, 3, 4};
    int target = 4;
    int[] result = twoSum(nums, target);
    System.out.println(result[0] + " " + result[1]);
    // 输出:0 1
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现LeetCode(1.两数之和) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 一文读懂JAVA中HttpURLConnection的用法

    一文读懂JAVA中HttpURLConnection的用法 HttpURLConnection是Java中用于远程调用HTTP服务的类,支持HTTP/HTTPS协议,并提供了GET、POST、PUT等常见HTTP方法。 HttpURLConnection的使用步骤 创建一个URL对象,指向需要访问的URL地址。 打开连接对象,并设置请求方法,设置是否允许输出…

    Java 2023年6月15日
    00
  • java异常处理执行顺序详解try catch finally

    当程序在运行时出现了问题,比如程序抛出了一个异常,Java提供了一种异常处理机制来防止程序在这种情况下崩溃。其中,try-catch-finally语句块是Java异常处理机制中最重要的部分。 以下是“java异常处理执行顺序详解try catch finally”的完整攻略: Java异常处理机制 Java异常处理机制是一种程序控制结构,用于处理运行时的异…

    Java 2023年5月27日
    00
  • java简单快速排序实例解析

    Java简单快速排序实例解析 快速排序是一种常用的排序算法,其本质是通过不断地把数列分成两个部分,分别进行递归排序,最终完成整个数列的排序。 实现思路 快速排序的实现思路如下: 选择一个基准元素,在数列中选择一个数作为基准元素pivot,一般选择第一个或者最后一个元素; 分割数组,将数列中所有小于基准元素的数放在它的左侧,所有大于基准元素的数放在它的右侧; …

    Java 2023年5月19日
    00
  • Java 网络编程 —— Socket 详解

    构造 Socket 在【客户端/服务端】的通信模式中,客户端需要主动构造与服务器连接的 Socket,构造方法有以下几种重载形式: Socket() Socket(InetAddress address, int port) throws UnknownHostException,IOException Socket(InetAddress address,…

    Java 2023年4月30日
    00
  • 完美解决java.lang.OutOfMemoryError处理错误的问题

    下面我将详细讲解如何完美解决 java.lang.OutOfMemoryError 错误的处理问题。 什么是 java.lang.OutOfMemoryError 错误? java.lang.OutOfMemoryError 错误是指 Java 应用程序在运行时申请的内存超过了 Java 虚拟机所能分配的最大内存限制,导致 Java 虚拟机耗尽了可用内存造成…

    Java 2023年5月27日
    00
  • Java实现经典游戏2048的示例代码

    以下是“Java实现经典游戏2048的示例代码”的完整攻略: 1. 确定游戏规则和逻辑 在开始编写游戏代码之前,需要先确认游戏规则和逻辑。2048游戏的规则是:玩家通过移动方块,让相同数字的方块叠加在一起,最终得到2048方块。每次移动时,所有方块会向移动的方向靠拢,相同数字的方块叠加在一起,如果四个方向都没有可以移动的方块,则游戏结束。 2. 创建代码框架…

    Java 2023年5月19日
    00
  • Java dbcp连接池基本使用方法详解

    首先,让我们来介绍一下什么是Java DBCP连接池。 什么是Java DBCP连接池? Java DBCP(Database Connection Pool)连接池是一种连接管理工具,它通过在内存中维护一定数量的数据库连接,避免了重复连接数据库的开销,提升了应用程序的性能。Java DBCP连接池可以在应用程序和数据库服务之间提供一个中间层,负责管理和分配…

    Java 2023年5月19日
    00
  • 浅谈javaSE 面向对象(Object类toString)

    浅谈JavaSE面向对象(Object类toString) 什么是面向对象? 面向对象(OOP)是一种计算机编程方法,它基于对象、类和封装等概念。在面向对象编程中,使用对象来表示现实世界的实体,并使用类来描述对象的属性和行为。封装则是指:将数据和方法组合成类并隐藏其实现细节的过程。 Object类和toString方法 在Java中,所有的对象都继承自Obj…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部