Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Checkson opened this issue Mar 26, 2019 · 0 comments
Open

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

Checkson opened this issue Mar 26, 2019 · 0 comments

Comments

@Checkson
Copy link
Owner

Checkson commented Mar 26, 2019

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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant