01.两数之和
暴力解法: O( N 2 N^2 N2)两层for循环遍历所有可能.
收获: 学会如何返回数组.
static int[] twoSum(int[] nums, int target) {
for(int i = 0 ;i<nums.length ;i++){
for(int j = 0 ; j < nums.length ; j++){
if( i == j)
continue;
if(nums[i]+ nums[j] == target){
return new int[] {i,j};//返回数组
}
}
}
return null;
}
HashMap:O( N N N)采用HashMap可以将时间复杂度降一个级别,原因在于HashMap查询元素的时间复杂度为O(1),其实暴力解法一的第二层for循环可以看作查询能使 nums[i]+ nums[j] == target 的nums[j],只不过查询的复杂度为O( N N N).
收获: 学会使用HashMap,善用HashMap查询时间复杂度为O(1)
补充: HashMap底层原理(链地址法解决哈希冲突)
static int[] twoSum2(int[] nums,int target){
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0 ; i < nums.length ; i++){
int n = target - nums[i];
if(map.containsKey(n)){ //containsKey(n):是否包含键值 n
//get(n):得到键值为n的value值,本题中就是数组下标
return new int[] {map.get(n),i};
}
map.put(nums[i],i);
}
throw new IllegalArgumentException("No two sum solution");
}