LeetCode力扣每日一题(Java):1、两数之和

一、题目

二、解题思路

方法一:暴力枚举

这是最容易想到的一种方法,本质就是二重循环遍历数组,话不多说直接上代码

java 复制代码
public int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if(nums[i] + nums[j] == target){
                    return new int[]{i, j};
                }
            }
        }
        return new int[]{};
    }

虽说这种方法简单,但在解题过程中我还是感到自己java基础的不牢。比如我一开始if中的代码是这样写的:

int\[\] arr = { i,j };

return arr;

后来发现可以直接return new int\[\]{i, j};

而且我一开始没有在for循环外面写return new int\[\]{}; 导致代码编译出错,报错提示是:缺少返回值

看来要打算法竞赛我还是任重而道远的

方法二:哈希表

这是一种我从没接触过的方法,而且数据结构基本上忘光了(偷笑)

所以我们首先回顾一下什么是哈希表:简单来说就是通过hash函数将关键字的值映射到对应的存储地址中。常用的哈希函数方法有直接定址法、除留余数法等,定址时还涉及到哈希冲突的解决。

再看力扣官方题解

注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。

使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N)降低到 O(1)。

这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。

作者:力扣官方题解

链接:https://leetcode.cn/problems/two-sum/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; ++i) {
            if (hashtable.containsKey(target - nums[i])) {
                return new int[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i], i);
        }
        return new int[0];
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/two-sum/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

好家伙,你一波操作猛如虎,而我愣是没看懂......好吧,看来确实没学扎实,只能一个一个概念去学了

此处省略很多时间,太多要学的啦

了解完各个概念之后,我们给这段代码打上详细的注释

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 创建一个哈希表,用于存储元素和索引的映射关系
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        
        // 遍历数组中的每个元素
        for (int i = 0; i < nums.length; ++i) {
            // 计算目标值与当前元素的差值
            int complement = target - nums[i];
            
            // 如果哈希表中存在差值,则返回结果
            if (hashtable.containsKey(complement)) {
                // 返回两个元素的索引
                return new int[]{hashtable.get(complement), i};
            }
            
            // 将当前元素和索引加入哈希表
            hashtable.put(nums[i], i);
        }
        
        // 如果没有找到符合条件的两个元素,返回空数组
        return new int[0];
    }
}
相关推荐
明月_清风35 分钟前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣39 分钟前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
hetao17338371 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J1 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康2 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a187927218312 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN4 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
PFFstronger4 小时前
测试工程师的职业价值
职场和发展
青 春 记 忆4 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
阳明山水5 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构