LeetCode全排列2(js简单快通法)

题目描述

给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]

输出:

javascript 复制代码
[[1,1,2],
 [1,2,1],
 [2,1,1]]

示例 2:

输入:nums = [1,2,3]

输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

解题思路

使用 全排列 函数生成所有排列,然后去重以得到最终结果

代码

javascript 复制代码
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function(nums) {
    const result = [];
            if (nums.length === 1) {
                return [nums];
            } else {  //遍历每一项
                for (let i = 0; i < nums.length; i++) {
                    let first = nums[i];   //拿到当前的元素
                    let left = nums.slice(0, i).concat(nums.slice(i + 1));  //除当前元素的其他元素组合
                    let rest = permuteUnique(left);     //上一次递归返回的全排列
                    for (let j = 0; j < rest.length; j++) {    //组合在一起
                        let next = [first].concat(rest[j]);
                        result.push(next);
                    }
                }
            }
            // 将数组中的每个排列转换为字符串形式
            const stringArr = result.map(arr => arr.join(','));
            // 使用 Set 进行去重
            const uniqueSet = new Set(stringArr);
           // 先将 Set 转换为数组,然后使用 map 函数将字符串数组转换回数字数组
            const uniqueArr = Array.from(uniqueSet, str => str.split(',').map(Number));
        return uniqueArr;
};

知识点

Array.from() 是 JavaScript 中的一个静态方法,它用于从类数组或可迭代对象创建一个新的数组实例。这个方法非常有用,因为它提供了一种简便的方式来将各种集合或看起来像数组的对象转换成真正的数组。

基本用法

javascript 复制代码
const arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

const actualArray = Array.from(arrayLike);
// actualArray 将会是 ['a', 'b', 'c']

在上面的例子中,arrayLike 是一个类似于数组的对象,它具有索引属性和 length 属性。使用 Array.from() 可以创建一个新的数组,其中包含了 arrayLike 中的元素。

带映射函数的用法

Array.from() 还可以接受一个映射函数作为第二个参数,这个函数会在创建新数组的过程中被调用,用于转换每个元素。

javascript 复制代码
const arrayLike = {
    '0': 1,
    '1': 2,
    '2': 3,
    length: 3
};

const actualArray = Array.from(arrayLike, item => item * 2);
// actualArray 将会是 [2, 4, 6]

在这个例子中,映射函数 item => item * 2 被应用于 arrayLike 的每个元素,将每个数字乘以 2。

Set 创建数组

当你有一个 Set 对象并希望将其转换为数组时,Array.from() 是一个非常合适的选择。

javascript 复制代码
const set = new Set(['a', 'b', 'c']);
const array = Array.from(set);
// array 将会是 ['a', 'b', 'c']

Map 创建数组

同样,Array.from() 也可以从 Map 对象的键或值创建数组。

javascript 复制代码
const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
const keys = Array.from(map.keys());
const values = Array.from(map.values());
// keys 将会是 ['key1', 'key2']
// values 将会是 ['value1', 'value2']

Array.from() 是 JavaScript 中处理集合和数组转换的非常强大的工具,它的灵活性和易用性使其成为日常编程中常用的方法之一。

相关推荐
2603_965896624 分钟前
JavaScript 对象零基础详解|属性、方法、遍历、增删改查
开发语言·javascript·ecmascript
Navigator_Z13 分钟前
LeetCode //C - 1223. Dice Roll Simulation
c语言·算法·leetcode
171320330计算机毕设编程15 分钟前
2027计算机毕设五大方向对比&选题推荐
java·ide·python·算法·django·php·推荐算法
Tisfy19 分钟前
LeetCode 2058.找出临界点之间的最小和最大距离:遍历+遇到极值则更新(这种题谁空间复杂度不是O(1)啊)
linux·数据库·leetcode·链表·题解·模拟·遍历
万物智能28 分钟前
设备树DTS-【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
后端·算法
用户2832096793729 分钟前
从进程线程到 async/await:JS Event-loop事件循环机制底层解析
前端·javascript
代码不停35 分钟前
子数组问题
java·算法
guanguan0_041 分钟前
用 AI 做技术方案评审:输入 3 个方案,输出对比矩阵 + 推荐理由
javascript·人工智能·矩阵·ai编程
小欣加油44 分钟前
Leetcode2058 找出临界点之间的最小和最大距离
数据结构·c++·算法·leetcode·职场和发展
华华哥20221 小时前
《模型不玄学》第25章 双头模型:共享底座 + 两个分支
算法