3
无重复字符的最长子串
中等频率: 1033
146
LRU缓存机制
中等频率: 818
206
反转链表
简单频率: 712
215
数组中的第K个最大元素
中等频率: 554
25
K个一组翻转链表
困难频率: 475
15
三数之和
中等频率: 439
53
最大子数组和
中等频率: 354
912
排序数组
中等频率: 327
21
合并两个有序链表
简单频率: 310
5
最长回文子串
中等频率: 308
200
岛屿数量
中等频率: 295
33
搜索旋转排序数组
中等频率: 290
46
全排列
中等频率: 282
88
合并两个有序数组
简单频率: 274
20
有效的括号
简单频率: 267
121
买卖股票的最佳时机
简单频率: 259
236
二叉树的最近公共祖先
中等频率: 254
92
反转链表 II
中等频率: 253
141
环形链表
简单频率: 246
300
最长上升子序列
中等频率: 240
54
螺旋矩阵
中等频率: 239
143
重排链表
中等频率: 230
23
合并K个排序链表
困难频率: 225
415
字符串相加
简单频率: 213
56
合并区间
中等频率: 211
160
相交链表
简单频率: 197
42
接雨水
困难频率: 186
1143
最长公共子序列
中等频率: 174
124
二叉树中的最大路径和
困难频率: 174
93
复原IP地址
中等频率: 171
82
删除排序链表中的重复元素 II
中等频率: 170
19
删除链表的倒数第N个节点
中等频率: 169
142
环形链表 II
中等频率: 165
4
寻找两个正序数组的中位数
困难频率: 158
199
二叉树的右视图
中等频率: 150
165
比较版本号
中等频率: 148
704
二分查找
简单频率: 140
22
括号生成
中等频率: 139
94
二叉树的中序遍历
简单频率: 139
239
滑动窗口最大值
困难频率: 137
69
x 的平方根
简单频率: 135
148
排序链表
中等频率: 135
32
最长有效括号
困难频率: 134
31
下一个排列
中等频率: 132
8
字符串转换整数 (atoi)
中等频率: 129
70
爬楼梯
简单频率: 124
322
零钱兑换
中等频率: 123
43
字符串相乘
中等频率: 120
76
最小覆盖子串
困难频率: 117
41
缺失的第一个正数
困难频率: 108
105
从前序与中序遍历序列构造二叉树
中等频率: 106
78
子集
中等频率: 102
151
翻转字符串里的单词
中等频率: 101
155
最小栈
简单频率: 96
34
在排序数组中查找元素的第一个和最后一个位置
中等频率: 94
394
字符串解码
中等频率: 91
101
对称二叉树
简单频率: 91
39
组合总和
中等频率: 89
470
用 Rand7() 实现 Rand10()
中等频率: 87
64
最小路径和
中等频率: 87
104
二叉树的最大深度
简单频率: 87
110
平衡二叉树
简单频率: 85
144
二叉树的前序遍历
简单频率: 84
48
旋转图像
中等频率: 82
234
回文链表
简单频率: 82
695
岛屿的最大面积
中等频率: 82
122
买卖股票的最佳时机 II
简单频率: 82
240
搜索二维矩阵 II
中等频率: 81
221
最大正方形
中等频率: 81
98
验证二叉搜索树
中等频率: 80
543
二叉树的直径
简单频率: 79
14
最长公共前缀
简单频率: 78
179
最大数
中等频率: 76
113
路径总和 II
中等频率: 76
662
二叉树最大宽度
中等频率: 76
62
不同路径
中等频率: 73
198
打家劫舍
中等频率: 71
152
乘积最大子数组
中等频率: 71
560
和为K的子数组
中等频率: 70
112
路径总和
简单频率: 68
226
翻转二叉树
简单频率: 67
209
长度最小的子数组
中等频率: 67
227
基本计算器 II
中等频率: 67
169
多数元素
简单频率: 67
24
两两交换链表中的节点
中等频率: 66
139
单词拆分
中等频率: 65
283
移动零
简单频率: 64
718
最长重复子数组
中等频率: 64
1
两数之和
简单频率: 5
2
两数相加
中等频率: 4

1. 两数之和

查看题目
简单
数组
哈希表
频率: 5

解法暴力解法

时间复杂度:O(n²) | 空间复杂度:O(1) | 推荐使用

动画演示

准备就绪 - 点击开始按钮查看动画

代码实现

class Solution {
    /**
     * 暴力解法
     * 枚举所有可能的两数组合,时间复杂度O(n²)
     */
    public int[] twoSum(int[] nums, int target) {
        if (nums == null) {
            return null;
        }
        int[] result = new int[2];
        for (int i = 0; i < nums.length; i++) {
            result[0] = i;
            for (int j = i + 1; j < nums.length; j++) {
                result[1] = j;
                if (nums[result[0]] + nums[result[1]] == target) {
                    return result;
                }
            }
        }
        return result;
    }
}
时间复杂度:O(n²)
空间复杂度:O(1)
算法思路: 暴力解法通过双重循环枚举所有可能的两数组合,直到找到和为target的组合。 核心思想: 1. 外层循环:遍历数组每个元素,索引i从0到n-1 2. 内层循环:对于每个i,遍历i之后的元素,索引j从i+1到n-1 3. 检查nums[i] + nums[j]是否等于target 4. 如果相等,返回[i, j];否则继续查找 复杂度分析: - 时间复杂度:O(n²),需要两层循环,最坏情况下需要比较n(n-1)/2次 - 空间复杂度:O(1),只使用了常数额外空间,不随输入规模变化

解法哈希表优化

时间复杂度:O(n) | 空间复杂度:O(n)

动画演示

准备就绪 - 点击开始按钮查看动画

代码实现

class Solution {
    /**
     * 哈希表优化解法
     * 使用HashMap存储已遍历的元素,实现O(n)时间复杂度
     */
    public int[] twoSum(int[] nums, int target) {
        // hashtable的key为数组的值,value为数组的下标
        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];
    }
}
时间复杂度:O(n)
空间复杂度:O(n)
算法思路: 使用哈希表优化两数之和问题,将时间复杂度从O(n²)降低到O(n)。 核心思想: 1. 遍历数组,对于每个元素nums[i],计算需要的配对值:target - nums[i] 2. 查询哈希表中是否存在该配对值 3. 如果存在,直接返回两个索引 4. 如果不存在,将当前元素值和索引存入哈希表,继续遍历 复杂度分析: - 时间复杂度:O(n),只需遍历数组一次,哈希表提供O(1)的查找时间 - 空间复杂度:O(n),最坏情况下需要存储n-1个元素到哈希表