前端算法(54)

91 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

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

题目解析

思路一

我们这里先创建一个只存储一个解集的数组,在创建一个存储所有解集的空数组,在获取原数组的长度,在定义一个递归方法,参数为下标值,如果递归的当前下标大于等于数组的长度,此递归就返回,在把一个子集存入到最后结果数组中,在子集数组中存入当前下标的原数组值,在递归这个函数(参数,下标值+1),在把子集数组的最后一个值弹出,继续递归这个函数(参数,下标值+1),最后调用这个递归函数(参数为下标值,从0开始),

/** 
* @param {number[]} nums 
* @return {number[][]} 
*/
var subsets = function(nums) {
    let t = []; 
    let result = []; 
    let length = nums.length; 
    function back(index) { 
        if(index === length){
            result.push(t.slice()); 
            return;
        } else {
            t.push(nums[index]); 
            back(index + 1); 
            t.pop(); 
            back(index + 1);
        }
    }
    back(0);
    return result;
};

思路二

我们每次从 nums 挑出来的元素,不能比当前已经挑出来的元素里最大的那个还要大,在通过maxIndex来记录这个当前已经挑出来的元素里最大的那个的位置,下次挑的时候从这里开始迭代最后用 count 记录还要挑几个等于 0 则结束

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
//存储结果数组
  var result = []
  //声明函数
  var select = (current, count, maxIndex) => {
  //判断当前count值是否为0,为0则直接添加到结果数组中
    if (count === 0) {
      result.push(current)
    } else {
      for (var i = maxIndex; i < nums.length; i ++) {
        select([...current, nums[i]], count - 1, i + 1)
      }
    }
  }
  //进行循环调用当前的函数
  for (var i = 0; i <= nums.length; i ++) {
    select([], i, 0)
  }
  return result
};