题目描述
解题思路-暴力枚举(最容易想到)
对整数数组nums[]遍历两次,找到nums[i]+nums[j]==target的i和j,返回i和j.
源码提交
- 时间复杂度:O(N*N)
- 空间复杂度:O(1)
- 提交记录
- 源码
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] arry = new int[2];//可以直接去掉这种初始化数组,直接在return的那里newy一个int[]
for(int i=0;i<nums.length-1;i++){
for(int j=i+1;j<nums.length;j++){
if(target==(nums[i]+nums[j])){
arry[0]=i;
arry[1]=j;
break;
}
}
}
return arry;
}
}
参照LeetCode官方题解
方法一 暴力枚举
- 时间复杂度:O(N*N)
- 空间复杂度:O(1)
- 提交记录
- 源码
class Solution {
public int[] twoSum(int[] nums, int target) {
//method 1 暴力枚举
//时间复杂度:O(N*N);空间复杂度:O(1)
for(int i=0;i<nums.length-1;++i)
for(int j=i+1;j<nums.length;++j)
if(target==(nums[i]+nums[j]))
return new int[]{i,j};
return new int[0];
}
}
方法二 哈希表
- 时间复杂度:O(N)
- 空间复杂度:O(N)
- 提交记录
- 源码
class Solution {
public int[] twoSum(int[] nums, int target) {
//method 2 哈希表
//时间复杂度:O(N);空间复杂度:O(N)。(用空间换时间)
Map<Integer,Integer>map = new HashMap<Integer, Integer>();
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 new int[0];//int[2]=[0,0],默认初始值为0
}
}
注意:这里是把数组nums的值作为map的key,把下标作为value(一开始我写成map.put(i,nums[i],想要用containsValue()函数判断取对应的key,发现代码的时间复杂度会更多,也有可能我写得不对);目的是为了做判断,当map.containsKey(target-nums[i])时,取此时map的key对应的value。
学习笔记
-
数组初始化
//数组初始化方式
int[] arry = new int[2];//初始化数组值为0,即{0,0}
int[] arry = new int[]{1,2,3}
int[] arry = {1,1};
-
数组的长度
int len = arry.length;//正确
int len = arry.length();//错误
int len = arry.size();//错误
-
哈希表使用
-
Map是一个接口;HashMap是对该接口的重要实现。(就跟List是接口,ArrayList是对该接口的实现)
-
HashMap的containsKey(11)方法用来判断哈希表里的key是否有这个11,返回值为true or false。同样也有containsValue()方法。
-
for循环中使用++i来代替i++.虽然循环中执行效果一样,但是++i不会产生一个临时变量(i++会产生一个临时变量),直接+1,性能更好。并且++i可以作为左值使用(我在leetcode上java环境测试以下代码提示有bug???)
int i = 0; ++i = 1; //正确 i++ = 5; //错误
(如有错误,欢迎批评指正!)