console.log = console.info
function isOk(a, b, target) {
return a + b === target
}
function twoSum(nums, target) {
if (nums.length < 2) return null
const result = []
let curIndex = 0
while (curIndex < nums.length - 1) {
for (let i = curIndex + 1; i < nums.length; i++) {
isOk(nums[curIndex], nums[i], target) && result.push([nums[curIndex], nums[i]])
}
curIndex++
}
return !result.length ? null : result
}
console.log(twoSum([1, 0, -1, 0, -2, 2], 0))
function threeSum(nums, target) {
if (nums.length < 3) return null
const result = []
let curIndex = 0
while (curIndex < nums.length - 2) {
const temp = twoSum(nums.slice(curIndex + 1), target - nums[curIndex])
if (temp) {
temp.forEach(item => {
item.unshift(nums[curIndex])
result.push(item)
})
}
curIndex++
}
return !result.length ? null : result
}
console.log(threeSum([1, 0, -1, 0, -2, 2], 0))
function fourSum(nums, target) {
if (nums.length < 4) return null
const result = []
let curIndex = 0
while (curIndex < nums.length - 3) {
const temp = threeSum(nums.slice(curIndex + 1), target - nums[curIndex])
if (temp) {
temp.forEach(item => {
item.unshift(nums[curIndex])
result.push(item)
})
}
curIndex++
}
return !result.length ? null : result
}
function nSum(nums, target, n) {
if (nums.length < n) return null
const result = []
let curIndex = 0
if (n === 2) {
// return twoSum(nums, target)
// copy twoSum
while (curIndex < nums.length - 1) {
for (let i = curIndex + 1; i < nums.length; i++) {
isOk(nums[curIndex], nums[i], target) && result.push([nums[curIndex], nums[i]])
}
curIndex++
}
return !result.length ? null : result
}
while (curIndex < nums.length - (n - 1)) { // -1,是因为自己占了一个数
const temp = nSum(nums.slice(curIndex + 1), target - nums[curIndex], n - 1)
if (temp) {
temp.forEach(item => {
item.unshift(nums[curIndex])
result.push(item)
})
}
curIndex++
}
return !result.length ? null : result
}
console.log(fourSum([1, 0, -1, 0, -2, 2], 0))
console.log(nSum([1, 0, -1, 0, -2, 2], 0, 4))
console