Leetcode Day8
leetcode -17 电话号码的字母组合
- 題目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
- 解 : 表驅動
/**
* @param {string} digits
* @return {string[]}
*/
const alphaNumber = {
'2': ['a', 'b', 'c'],
'3': ['d', 'e', 'f'],
'4': ['g', 'h', 'i'],
'5': ['j', 'k', 'l'],
'6': ['m', 'n', 'o'],
'7': ['p', 'q', 'r', 's'],
'8': ['t', 'u', 'v'],
'9': ['w', 'x', 'y', 'z']
}
let letterCombinations = function(digits) {
if(digits === '')
return []
let res = []
for(let num of digits) {
let arr = alphaNumber[num]
if(res.length > 0) {
let tmp = []
for(let i=0; i<res.length; i++) {
for(let j=0; j<arr.length; j++) {
tmp.push(res[i] + arr[j])
}
}
res = tmp
}else {
res.push(...arr)
}
}
return res
}
leetcode -18 四数之和
- 題目描述
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
- 解 : 循環 + 雙指針
通過兩個固定指針以及兩個移動指針逼近 target。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
let fourSum = function(nums, target) {
if(nums.length < 4)
return []
nums.sort((a, b) => { return a-b })
const res = []
for(let i=0; i<nums.length-3; i++) {
if(i > 0 && nums[i] === nums[i-1]) { // 去除可能的重複組合
continue
}
if(nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target) {
break
}
for(let j=i+1; j<nums.length-2; j++) {
if(j > i+1 && nums[j] === nums[j-1]) { // 去除可能的重複組合
continue
}
let left = j+1
let right = nums.length-1
while(left < right) {
const sum = nums[i] + nums[j] + nums[left] + nums[right]
if(sum === target) {
const tmp = [nums[i], nums[j], nums[left], nums[right]]
res.push(tmp)
while(left < right && nums[left] === nums[left+1]) {
left++
}
while(left < right && nums[right] === nums[right-1]) {
right--
}
left++
right--
}else if(sum < target) {
left++
}else {
right--
}
}
}
}
return res
}