1 两数之和
# 无脑暴力解 3848 ms (27.38%) 11.8 MB
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums) - 1):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
// 单循环 72 ms (89.73%) 34.8 MB(35.22%)
var twoSum = function(nums, target) {
let m = new Map();
for (let i = 0; i < nums.length; i++){
let val = nums[i]
if (m.has(target - val)){
return [m.get(target - val), i]
}else{
m.set(val, i)
}
}
return []
};
15 三数之和
// 192ms 92.33% 47.4mb 35.09%
var threeSum = function(nums){
let res = []
nums.sort((a, b) => a-b)
for (let i = 0; i <= nums.length-3; i++){
if (i > 0 && nums[i] === nums[i-1]) continue
for (let j = i+1, k = nums.length-1; j < k;){
if (nums[j] === nums[j-1] && nums[k+1] !== undefined && nums[k] === nums[k+1]){
k--
continue
}
if (nums[j] + nums[k] < -nums[i]){
j++
}else if(nums[j] + nums[k] > -nums[i]){
k--
}else{
res.push([nums[i], nums[j], nums[k]])
j++
k--
}
}
}
return res
}
nums = [-1, 0, 1, 2, -1, -4]
// console.log(threeSum(nums))
// nums = [0, 0, 0, 0]
// nums = [-2, 0,0,2,2]
// nums = [1, 1, -2]
// nums = [-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
// nums = [-4,-2,1,-5,-4,-4,4,-2,0,4,0,-2,3,1,-5,0]
// nums = [-1,-2,-3,4,1,3,0,3,-2,1,-2,2,-1,1,-5,4,-3]
console.log(threeSum(nums))
视频里的有一种解法老师用python写的,说他觉得这种比较自然,相比上面写的这种。但是我用js写的时候就觉得还是上面这种更好,因为python的那种是直接把结果存tuple里,然后扔到set里面,这样就去重了。我还才知道对于两个tuple,只要里面每个位置的元素是相等的那就是相等的!但是js里不能这么搞啊。所以还是得用上面这种办法,先排序,第二个for里面用两个指针分别从两头往中间走。然而这两个continue的判断才是耗时间的地方ORZ,折腾好久。
看了他的判断是写成下面这样,感觉这样更优雅
var threeSum = function(nums){
let res = []
nums.sort((a, b) => a-b)
for (let i = 0; i <= nums.length-3; i++){
if (i > 0 && nums[i] === nums[i-1]) continue
for (let j = i+1, k = nums.length-1; j < k;){
if (nums[j] + nums[k] < -nums[i]){
j++
}else if(nums[j] + nums[k] > -nums[i]){
k--
}else{
res.push([nums[i], nums[j], nums[k]])
while(j<k && nums[j] === nums[j+1]){
j++
}
while(j<k && nums[k] === nums[k-1]){
k--
}
j++
k--
}
}
}
return res
}