适用问题
思路
给定一个不包含重复数字的整数集合 nums ,按任意顺序 返回它所有不重复的全排列。
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
const n = nums.length, r = []
const d = ar => {
if (ar.length === n) return r.push(ar.slice())
for (let i = 0; i < n; i++) {
if (ar.includes(nums[i])) continue
ar.push(nums[i])
d(ar)
ar.pop()
}
}
d([])
return r
};
var permute = function(nums) {
const n = nums.length, r = [], stack = [[]]
while (stack.length) {
const ar = stack.pop()
if (ar.length === n) r.push(ar.slice())
else {
for (let i = 0; i < n; i++) {
if (ar.includes(nums[i])) continue
stack.push(ar.concat(nums[i]))
}
}
}
return r
};
var permute = function(nums) {
const n = nums.length, r = []
const d = ar => {
if (ar.length === n) return r.push(ar)
for (let i = 0; i < n; i++) {
if (ar.includes(nums[i])) continue
d(ar.concat(nums[i]))
}
}
d([])
return r
};
哈希表记录访问过的索引
var permute = function(nums) {
const n = nums.length, r = []
const d = (ar, visited) => {
if (ar.length === n) return r.push(ar.slice())
for (let i = 0; i < n; i++) {
if (visited[i]) continue
visited[i] = 1
ar.push(nums[i])
d(ar, visited)
ar.pop()
visited[i] = 0
}
}
d([], new Uint8Array(n))
return r
};
给定一个可包含重复数字的整数集合 nums ,按任意顺序 返回它所有不重复的全排列。
var permuteUnique = function(nums) {
const n = nums.length, r = []
const d = (ar, visited) => {
if (ar.length === n) return r.push(ar.slice()) // [...ar] Array.from(ar)
for (let i = 0; i < n; i++) {
if (visited.has(i) || i > 0 && nums[i] === nums[i - 1] && !visited.has(i - 1)) continue
visited.add(i)
ar.push(nums[i])
d(ar, visited)
ar.pop()
visited.delete(i)
}
}
nums.sort((a, b) => a - b)
d([], new Set)
return r
};
var permuteUnique = function(nums) {
const n = nums.length, r = []
const d = (ar, visited) => {
if (ar.length === n) return r.push(ar.slice()) // [...ar] Array.from(ar)
for (let i = 0; i < n; i++) {
if (visited[i] || i > 0 && nums[i] === nums[i - 1] && visited[i - 1] === 0) continue
visited[i] = 1
ar.push(nums[i])
d(ar, visited)
ar.pop()
visited[i] = 0
}
}
nums.sort((a, b) => a - b)
d([], new Uint8Array(n))
return r
};
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
数据在安全整数范围 [- (2 ** 53 - 1), 2 ** 53 + 1]
,即[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]
var printNumbers = function(n) {
return Array.from({length: 10 ** n - 1}, (_, i) => i + 1)
};
数据超过安全整数范围
var printNumbers = function(n) {
const r = []
const d = (ar, digit) => {
if (ar.length === digit) return r.push(ar.join(''))
for (let i = 0; i < 10; i++) {
if (i === 0 && ar.length === 0) continue
ar.push(i)
d(ar, digit)
ar.pop()
}
}
for (let i = 1; i <= n; i++) d([], i)
return r
};