Checkson / blog

Checkson个人博客
12 stars 3 forks source link

LeetCode(力扣)答案解析(十) #29

Open Checkson opened 5 years ago

Checkson commented 5 years ago

89. 格雷编码

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。

示例1:

输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2

对于给定的 n,其格雷编码序列并不唯一。
例如,[0,2,3,1] 也是一个有效的格雷编码序列。

00 - 0
10 - 2
11 - 3
01 - 1

示例2:

输入: 0
输出: [0]
解释: 我们定义格雷编码序列必须以 0 开头。
     给定编码总位数为 n 的格雷编码序列,其长度为 2^n。当 n = 0 时,长度为 2^0 = 1。
     因此,当 n = 0 时,其格雷编码序列为 [0]。

解法一(公式法)

/**
 * @param {number} n
 * @return {number[]}
 */
var grayCode = function (n) {
    var res = [];
    for (var i = 0, len = Math.pow(2, n); i < len; i++) {
        res.push((i >> 1) ^ i);
    }
    return res;
};

解析一:

格雷码是一种循环二进制单位距离码,主要特点是 两个相邻数的代码只有一位二进制数不同 的编码,格雷码的处理主要是位操作 Bit Operation。这里的解题思路依据主要是格雷编码第 n 项等于 n / 2 ^ n

更多解法,参考链接:

格雷码那点事——递归非递归实现。 LeetCode(89):格雷编码。

46. 全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

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

解法一(递归)

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    var ans = [];
    var len = nums.length;
    if (len === 0) return ans;
    permutation(nums, 0, len - 1, ans);
    return ans;
};

function permutation (nums, i, j, ans) {
    if (i === j) {
        ans.push(nums.slice(0, nums.length));
    } else {
        var temp;
        for (var k = i; k <= j; k++) {
            temp = nums[i];
            nums[i] = nums[k];
            nums[k] = temp;
            permutation(nums, i + 1, j, ans);
            temp = nums[i];
            nums[i] = nums[k];
            nums[k] = temp;
        }
    }
}

78. 子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

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

解法一:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
    var ans = [],
        out = [];
    nums.sort(compare);
    getSubsets(nums, 0, out, ans);
    return ans;
};

function getSubsets (nums, pos, out, ans) {
    ans.push(out.slice(0, out.length));
    for (var i = pos; i < nums.length; i++) {
        out.push(nums[i]);
        getSubsets(nums, i + 1, out, ans);
        out.pop();
    }
}

function compare (a, b) {
    return a - b;
}