说明: 所有题及部分分析来源于LeetCode 力扣官网
Day1
准备每天一题,热题100道,从通过率由高到低开始。
import java.util.HashMap;
/**
* @author : zhaohx_a
* @description:
* 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
*
* 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
*
* 你可以按任意顺序返回答案。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/two-sum
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* @date: 2022/3/17 0017 16:29
*/
public class d1_twoSum_1 {
public static void main(String[] args) {
int[] nums = new int[]{3,2,4};
int target = 6;
int[] solution = solution(nums, target);
for (int i : solution) {
System.out.println(i);
}
}
public static int[] solution(int[] nums, int target){
/*
合理解法:循坏一遍,让目标数减去的当前遍历的数字。
map(value,index)使用map.containsKey(key)方法进行判断
*/
HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
int[] result = new int[2];
for (int i = 0; i < nums.length; i++) {
if (hashMap.containsKey(target-nums[i])){
result[0] = hashMap.get(target-nums[i]);
result[1] = i;
}
else {
hashMap.put(nums[i],i);
}
}
return result;
}
/* 最佳提交
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<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};
}else {
map.put(nums[i],i);
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
*/
}
总结:
解题思路:列出出入参数,找到解题思路,再完善细节。考虑该题涉及什么样的知识点。
类型:该题考察的是数据结构和java基础知识。
收获:该题暴力解法为两次循环。最佳解法使用了map将时间复杂度降低了。
过程:考虑出参与入参,想到了map.containsKey() 方法。让目标值减去当前遍历的这个值,用containsKey方法进行判断是否存在。存在就返回当前的遍历计数器,和map中存放下标的值;不存在则将该值添加到map。map设计:要让方法可行,得将数组的值存在map的key中。
原理:map的key通过hash()算法确定位置,位置是固定的,除非经过扩容缩容。否则位置不会变化。
复杂度分析:
时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。