Java学习笔记
Leetcode刷题经验
热题HOT100
1、两数之和
由于题目已经假设每种输入只会对应一个答案,而且要求数组中同一个元素不能使用两遍,那么可以直接进行双层遍历,在第二次的遍历的时候直接在第一次遍历的数组元素下标+1即可,故很容易想到第一种思路。同时为了提高代码的可靠性,需要抛出异常。
第一种解题思路:
直接暴力求解,两次遍历即可,第一次遍历整数数组 nums 中的每个元素值,并分别对每个元素值再次进行遍历除该元素之外的整数数组 nums 中的其余每个元素,检查其是否等于 target - 对应的元素值,但该方法的时间复杂度为O(n^2),空间复杂度为O(1)。
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]==target-nums[j])
return new int[] {i,j};
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
第二种解题思路:
由于第一种暴力求解的方式的时间复杂度较高,故需进一步尝试优化,众所周知,哈希表的使用,可以看做是用额外的空间换取时间,故这里使用哈希表进行优化,分为两大步,首先,第一步,将所有元素都存入到 HashMap 中,然后,紧接着通过查找哈希表中是否存在已知的哈希表中元素对应的值,即target - 对应的元素值,即可完成。该方法的时间复杂度为O(n),空间复杂度为O(n)。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i]) && map.get(target-nums[i])!=i)
return new int[] {i,map.get(target-nums[i])};
}
throw new IllegalArgumentException("No two sum solution");
}
}
第三种解题思路:
按照第二种解题思路进一步进行优化,将两步合并为一步。关键点:在元素插入到表中的同时,检查表中是否已经存在当前元素所对应的目标元素,即target - 对应的元素值,如有,则代表查到,直接return即可,否则存入表中,再对下一元素进行同样操作。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<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);
}
throw new IllegalArgumentException("No two sum solution");
}
}
欢迎大家交流,一起进步!