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日

相关文章

  • SpringBoot项目启动时增加自定义Banner的简单方法

    Spring Boot项目启动时增加自定义Banner的简单方法 在Spring Boot项目启动时,我们可以增加自定义Banner,用于展示项目的Logo、名称、版本等信息。在本文中,我们将详细讲解如何增加自定义Banner,包括如何使用文本Banner和如何使用图片Banner。 使用文本Banner 使用文本Banner是最简单的方法,我们只需要在项目…

    Java 2023年5月15日
    00
  • MyBatis注解开发之实现自定义映射关系和关联查询

    MyBatis注解开发之实现自定义映射关系和关联查询 什么是MyBatis注解? MyBatis是一款优秀的持久层框架,在开发过程中,我们需要使用XML来进行SQL的映射配置,这对于开发人员来说,可能存在一定的学习成本。 MyBatis注解是MyBatis框架提供的一种新的映射方式,它可以帮助我们在代码中轻松实现SQL映射配置,从而简化开发者的学习成本和开发…

    Java 2023年5月20日
    00
  • Mybatis常见注解有哪些(总结)

    那么关于“Mybatis常见注解有哪些”,我建议从以下几个方面进行总结: 1. 增删改查注解 在Mybatis中,经常用到的增删改查操作,是可以使用注解方式进行实现的。其中常见的注解有: @Insert: 插入数据,通常与Mapper.xml文件中的Insert标签对应。 @Update: 更新数据,通常与Mapper.xml文件中的Update标签对应。 …

    Java 2023年5月19日
    00
  • XML经典问答

    XML经典问答攻略 本文将为您提供针对XML经典问题的攻略,以解决常见的XML相关问题。以下是您需要注意的几个方面: 1. XML文档结构 XML文件通常由一个根元素(root element)组成,并由开始标签和结束标签加以表示。中间可以嵌套若干子元素。元素可以包含属性(attribute)或文本(text)。如下所示: <?xml version=…

    Java 2023年5月20日
    00
  • 一小时迅速入门Mybatis之增删查改篇

    一小时迅速入门Mybatis之增删查改篇 Mybatis是一款优秀的ORM框架,其简单易用,功能强大,得到了广大开发者的喜爱。本文将为大家介绍使用Mybatis进行增删查改的完整攻略。 1. 环境准备 Mybatis需要依赖JDBC驱动和数据库连接池,建议使用Maven进行管理。这里我们以MySQL为例,展示如何配置环境。 首先在pom.xml文件中添加以下…

    Java 2023年5月20日
    00
  • AJAX SpringBoot 前后端数据交互的项目实现

    理解和实现AJAX SpringBoot前后端数据交互,需要涉及到以下知识点:SpringBoot、AJAX、RESTAPI和JSON数据格式。 1. 准备工作 首先,搭建一下SpringBoot的项目环境,然后在项目中引入一些必要的依赖,如下: Spring Boot Web Spring Boot Thymeleaf(或者其他视图模板依赖) Spring…

    Java 2023年6月2日
    00
  • 详解如何在SpringBoot项目中使用统一返回结果

    第一步:引入依赖 在pom.xml文件中引入spring-boot-starter-web和fastjson依赖: <dependencies> <!– 引入SpringBoot Web组件 –> <dependency> <groupId>org.springframework.boot</grou…

    Java 2023年5月26日
    00
  • Centos7.5配置java环境安装tomcat的讲解

    下面是完整的CentOS 7.5配置Java环境并安装Tomcat的攻略: 配置Java环境 1. 下载Java安装包 首先需要到官网下载Java安装包。一般推荐下载Java 8或者Java 11版本。 示例命令: wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux…

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