Leetcode Array
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 }