leetcode top100-01
最好能说明一下为什么不怕重复。看评论里有很多人提出这个问题,说hash冲突。 我在这里解答一下这个问题。
1.每次写入时,判断条件 不是当前的key本身存不存在,而是key和 tag 之间的差值存不存在,这一点很重要。
2.题目命题说明了一点,假定只有一个解。也就是说重复元素再多都无所谓。
case 1:如果有3个或者以上的重复元素,代表这个重复元素不可能是解,所以写入map的时候直接覆盖也无所谓;
case2:如果只有两个重复元素,同样的道理,假如这个重复元素是解,那么必定是两个重复元素的和等于tag。
这种情况下,当遇到第二个重复元素时,不会写入map,这个时候直接已经取到解了。
所以这种方式,不用考虑hash冲突的问题。
function twoSum(nums, target) {
const map = new Map();
for (let i = 0; i < nums.length; i++) {
const curNum = nums[i];
const targetNum = target - curNum;
const targetNumIndex = map.get(targetNum);
if (targetNumIndex !== undefined) {
return [targetNumIndex, i];
} else {
map.set(curNum, i);
}
}
}
const twoSum = (nums, target) => {
const prevNums = {}; // 存储出现过的数字,和对应的索引
for (let i = 0; i < nums.length; i++) { // 遍历元素
const curNum = nums[i]; // 当前元素
const targetNum = target - curNum; // 满足要求的目标元素
const targetNumIndex = prevNums[targetNum]; // 在prevNums中获取目标元素的索引
if (targetNumIndex !== undefined) { // 如果存在,直接返回 [目标元素的索引,当前索引]
return [targetNumIndex, i];
} else { // 如果不存在,说明之前没出现过目标元素
prevNums[curNum] = i; // 存入当前的元素和对应的索引
}
}
}
def directlySolution(nums: Array[Int], target: Int): Array[Int] = {
for (i <- nums.indices; j <- i + 1 until nums.length) {
if (nums(i) + nums(j) == target) {
return Array(i, j)
}
}
null
}
def hashSolution(nums: Array[Int], target: Int): Array[Int] = {
val map = new mutable.LinkedHashMap[Int, Int]
for (i <- nums.indices) {
if (map.contains(nums(i))) {
return Array(map(nums(i)), i)
}
map.put(target - nums(i), i)
}
Array(0, 0)
}