LeetCode 1. 俩数之和(Java)

本文介绍了如何解决寻找数组中两个数之和为目标值的问题,首先通过双重循环实现基础解法,时间复杂度为O(n^2)。然后引入哈希表,通过HashMap在O(n)的时间复杂度内找到答案,显著提升了效率。博客作者分享了从O(n^2)优化到O(n)的过程,强调了哈希表在算法优化中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.题目

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

 示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

 

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案


进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

解法一:双重for循环

伪代码展示:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //我们要找到2个数之和等于target
        //即我们需要找到nums[i] + nums[j] == target,并且返回他们的下标,即i和j,其中i != j
        int[] ans = new int[2]; //声明一个大小为2的数组用来保存结果
        //我们通过循环来遍历所有的数字
        int n = nums.length;  //用一个变量len保存nums的长度
        //i为第一个数的下标,nums一共有n个数,所以i的取值范围是[0, n-1]
        for(int i = 0; i < n; i++){
            //j为第二个数的下标。
            for(int j = i + 1; j < n; j++){
                //对于每个数nums[i],我们验证一遍其他数(nums[j])跟它的和是否等于target
                //如果满足条件
                if(nums[i] + nums[j] == target){
                    //将下标写入返回值数组里
                    ans[0] = i;
                    ans[1] = j;
                    //返回
                    return ans;
                }
            }
        }
        //默认返回值
        return new int[0];
    }
}

第一种方法比较容易想到,但是双重循环,但是时间复杂度有O(n^2),然后在此基础上,我们看下如何提升效能,减少时间复杂度。

        我们来分析这个问题,首先第一层循环,我们遍历每个数nums[i],确定是否有跟它之和等于target的数,这步每个数肯定是必须执行一次的,无法优化。
  第二层循环,我们是在找与nums[i]之和等于target的nums[j]。在二重循环里,我们使用了遍历(也就是顺序查找)的方式来确定这个nums[j],是否存在效率更高的查询方式呢?答案是存在的,我们可以通过哈希表的方式来在O(1)的时间复杂度里找到nums[j],从而使得总的时间复杂度变成O(n)。 

解法二:利用HashMap提升效率

HashMap是一个由键值对key-value组成的数据结构,key是由哈希函数来获取的,读写效率都是O(1),是提升时间效率最常用的数据结构。
声明方式:HashMap<Integer, Integer> map = new HashMap<>();

首先是类型是HashMap,然后<Integer, Integer>表示key和value的类别都是Integer,Integer是int的包装类,可以近似认为跟int是一样的。变量名叫map。new表示创建对象,创建的是一个HashMap,后面的<>里面按完整写法也是需要写成<Integer, Integer>的,不过现在java有局部类型推断的,可以不写。

伪代码展示:

class Solution1 {
    //已知一个数a,找到等于target - a的另一个数
   
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        //声明一个HashMap,key和value的类型都是int,变量名叫map,key和value分别记录数值和下标
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < n; i++){
            //如果存在nums[j] + nums[i] == target,那么nums[j] = target - nums[i]
            int diff = target - nums[i];
            //如果存在diff,则返回diff和nums[i]的下标
            //HashMap的containsKey方法判断该HashMap中是否存在这个key
            if(map.containsKey(diff)){
                //返回的时候直接创建一个数组,创建数组时可以直接初始化,就不需要填大小了,比如说new int[]{1, 2, 3};
                //此时创建一个大小为2的数组,第一个元素为map.get(diff)也就是map中对应diff的value,第二个元素就是i,也就是2个数的下标
                return new int[]{map.get(diff), i};
            }else   //否则,将nums[i]存入map中
                map.put(nums[i], i);
        }
        return new int[0];
    }
}

 

 许久没接触算法题,结果昨天写的时候就只想出了第一种解法,第二种解法还是看了其他朋友的题解才学会的,方知路漫漫其修远兮。继续加油!

### 解决 IntelliJ IDEA 中 `@Autowired` 注解导致的红色波浪线错误 在使用 Spring 框架时,如果遇到 `@Autowired` 注解下的依赖注入对象显示为红色波浪线错误或者黄色警告的情况,通常是由以下几个原因引起的: #### 1. **Spring 插件未启用** 如果 Spring 支持插件未被激活,则可能导致 IDE 无法识别 `@Autowired` 或其他 Spring 特定的功能。可以通过以下方式解决问题: - 打开设置菜单:`File -> Settings -> Plugins`。 - 确认已安装并启用了名为 “Spring Framework Support” 的官方插件[^1]。 #### 2. **项目配置文件缺失或不正确** Spring 需要通过 XML 文件、Java Config 类或其他形式来定义 Bean 定义。如果没有正确加载这些配置文件,可能会导致 `@Autowired` 报错。 - 确保项目的 `applicationContext.xml` 或者基于 Java 的配置类(带有 `@Configuration` `@Bean` 注解)已被正确定义引入。 - 对于 Spring Boot 项目,确认是否存在 `spring.factories` 文件以及是否包含了必要的组件扫描路径[^3]。 #### 3. **模块依赖关系问题** 当前模块可能缺少对 Spring Core 或 Context 组件库的有效引用。这可能是由于 Maven/Gradle 构建工具中的依赖项声明不足造成的。 - 检查 `pom.xml` (Maven) 或 `build.gradle` (Gradle),确保包含如下核心依赖之一: ```xml <!-- For Maven --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> ``` ```gradle // For Gradle implementation 'org.springframework:spring-context:${springVersion}' ``` - 更新项目依赖树以应用更改:右键点击项目根目录 -> `Maven -> Reload Project` 或运行命令 `./gradlew build --refresh-dependencies`。 #### 4. **IDE 缓存损坏** Intellij IDEA 的缓存机制有时会因各种因素而失效,从而引发误报错误。清除缓存可以有效缓解此类情况。 - 使用快捷组合键 `Ctrl + Alt + Shift + S` 进入项目结构对话框;也可以尝试执行操作序列:`File -> Invalidate Caches / Restart... -> Invalidate and Restart`. #### 5. **启动异常影响正常解析** 若之前存在类似 `com.intellij.diagnostic.PluginException` 的严重初始化失败日志记录,则表明某些关键服务未能成功加载,进而干扰到后续功能表现[^2]。建议重新下载最新稳定版本的 IDEA 并按照标准流程完成初次部署工作。 ```java // 示例代码片段展示如何正确运用 @Autowired 注解实现自动装配 @Service public class StudentService { private final Repository repository; public StudentService(@Qualifier("specificRepository") Repository repo){ this.repository = repo; } } @Component class SpecificComponent{ @Autowired private transient StudentService studentService; // 此处应无任何编译期告警现象发生 } ```
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brother汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值