第一种几乎有些java基础的人都可以做出来,双重for循环,暴力查找,有没有相加==target的。
即使简单,也要注意时间复杂度。
- 内层for循环从i+1开始,因为同一个元素不能使用两遍。
- 找到解后就可以break退出,因为只有一个解。(有无break运行时间相差近10s)
Code
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] ints = new int[2];
outer: for (int i = 0; i <nums.length ; i++) {
for (int j = i+1; j <nums.length ; j++) {
if (target-nums[i]==nums[j]){
ints[0]=i;
ints[1]=j;
break outer;
}
}
}
return ints;
}
}
Result
复杂度分析
- 时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
- 空间复杂度:O(1)。
Solution2
=========
可以看到题目相关里除了数组还有哈希表,那么考虑将数据存储在hashmap中,这样可以直接判断map中是否包含`x`。省去一层循环。
对于每一个 `x`,我们首先查询哈希表中是否存在 `target - x`,然后将 `x` 插入到哈希表中,即可保证不会让 `x` 和自己匹配。
这里牺牲了内存占用,节约了时间。
Code
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i <nums.length ; i++) {
if (map.containsKey(target-nums[i])){
// 这种写法很简单
return new int[]{map.get(target-nums[i]),i};
}
map.put(nums[i],i);
}
return null;
}
}
Result
复杂度分析
- 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素
x
,我们可以 O(1) 地寻找target - x
。
- 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。
学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,有需要的朋友可以转发分享下,同时可以关注我,定期分享学习资源还会更新一些技术分享!
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】
整理不易,有需要的朋友转发支持下,感谢感谢!
Java核心知识体系笔记.pdf
中高级Java开发面试高频考点题笔记300道.pdf
架构进阶面试专题及架构学习笔记脑图
Java架构进阶学习视频分享
30923044452)]
中高级Java开发面试高频考点题笔记300道.pdf
[外链图片转存中…(img-8EophZ0d-1630923044454)]
架构进阶面试专题及架构学习笔记脑图
[外链图片转存中…(img-ek4GusFO-1630923044456)]
Java架构进阶学习视频分享