curTain

  1. 四数之和

18. 四数之和

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例:

给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

满足要求的四元组集合为:

[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]

解题思路

  1. 对数组进行排序
  2. 将取得的值以 数组字符串 的形式存入数组
  3. 使用 Set 去重
  4. 使用 JSON.parse() 将元素恢复为数组对象

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
var fourSum = function(nums, target) {
let len = nums.length
let res = []
if( len < 4 ) return res
nums = nums.sort( ( a, b ) => a - b )
// 获取合适的值
for( let i = 0; i < len - 3; i ++ ){
for( let j = i + 1; j < len - 2; j ++ ){
for( let x = j + 1; x < len - 1; x ++ ){
for( let y = x + 1; y < len; y ++ ){
if( nums[i] + nums[j] + nums[x] + nums[y] === target ){
// 将值以字符串的形式存入数组
res.push( `[${nums[i]},${nums[j]},${nums[x]},${nums[y]}]` )
}
}
}
}
}
// 去重
res = [ ...new Set(res) ]
// 恢复元素为数组
res = res.map( item => JSON.parse( item ) )
return res
};

注意

使用 JSON.stringify() 函数处理对象时,属性为 undefinedfunction 会被忽略,所以在使用 JSON.stringify() 时需要先查看对象是否适合使用

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let obj = {
name: "tan",
age: undefined,
book: [
{ name: "chinese" },
{ name: "math" }
],
say: function(){
console.log( "my name is ", this.name )
}
}

JSON.stringify( obj )
// "{"name":"tan","book":[{"name":"chinese"},{"name":"math"}]}"

可知,值为 undefinedfunction 的属性已经被忽略了


 评论