我的解题过程
解题思路
使用嵌套循环,数组中所有元素两两相加一遍,判断两数之和是否为目标值,若符合则记录下标,将数组返回
java代码
class Solution {
public int[] twoSum(int[] nums, int target) {
int i,j;
int[] A = new int[2];
for(i=0;i<nums.length-1;i++){
if(i+1<nums.length){
for(j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
A[0]=i;
A[1]=j;
break;
}
else{
continue;
}
}
}
else{
continue;
}
}
return A;
}
}
复杂度分析
时间复杂度:O(N^2)
空间复杂度:O(1)
执行用时: 9 ms
内存消耗: 38.5 MB
问题与不足
1、第一次刷题,看完题目不假思索选择了嵌套循环,这是最简单暴力不动脑子的解法,但时间复杂度为O(n^2),自己平时写代码没有控制时间空间的意识,没有考虑过如何优化算法。
2、数组越界问题(总是粗心大意理不清脑子)
3、太久不写java了,语法忘得一干二净,本来就菜的我菜上加菜
其他优秀题解
1、哈希表(官方题解)
思路
这道题的时间主要耗费在寻找 target-X 上,查找的效率依赖于比较次数,缩短比较的次数就可以缩短查找的时间。哈希表可以做到一次存取,哈希函数为 H(key) = key
java代码
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashmap = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; ++i) {
//判断哈希表中是否存在键值为 target-X 的元素
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
//不存在则将nums[i]加入哈希表中
hashtable.put(nums[i], i);
}
return new int[0];
}
}
复杂度分析
时间复杂度:O(N)
空间复杂度:O(N)
相关语法及参考资料:
Map<Integer, String>A = new HashMap<Integer, Integer>
创建一个hashmap对象A,整型(Integer)的 key 和字符串(String)类型的 value
hashmap.containsKey(Object key)方法:检查HashMap中是否存在特定的键,返回值:True,False