LeetCode刷题笔记(1)–两数之和
题目难度:Easy
题目要求
##方法1:暴力求解
先确定数组长度为 n
两个for循环
如果两数相加为目标值,则返回其下标(定义一个新数组),否则继续循环;
题目规定必有解,
若没有,返回新数组【0】;
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
}
return new int[0];
}
}
复杂度分析:
- 时间复杂度:O(N^2),其中 N是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
- 空间复杂度:O(1)。
##方法2 哈希表求解
创建一个哈希表,对于每一个数 x,
首先查询哈希表中是否存在 target-x,
如果没有,就将 x 插入到哈希表中,
如果有,就返回这个数的值。
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];
}
}
复杂度分析:
- 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1)地寻找 target - x。
- 空间复杂度:O(N),其中 N是数组中的元素数量。主要为哈希表的开销。