mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
Merge pull request #1283 from xiaofei-2020/dp17
添加(0474.一和零.md):增加typescript版本
This commit is contained in:
@ -323,6 +323,129 @@ const findMaxForm = (strs, m, n) => {
|
||||
};
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
> 滚动数组,二维数组法
|
||||
|
||||
```typescript
|
||||
type BinaryInfo = { numOfZero: number, numOfOne: number };
|
||||
function findMaxForm(strs: string[], m: number, n: number): number {
|
||||
const goodsNum: number = strs.length;
|
||||
const dp: number[][] = new Array(m + 1).fill(0)
|
||||
.map(_ => new Array(n + 1).fill(0));
|
||||
for (let i = 0; i < goodsNum; i++) {
|
||||
const { numOfZero, numOfOne } = countBinary(strs[i]);
|
||||
for (let j = m; j >= numOfZero; j--) {
|
||||
for (let k = n; k >= numOfOne; k--) {
|
||||
dp[j][k] = Math.max(dp[j][k], dp[j - numOfZero][k - numOfOne] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[m][n];
|
||||
};
|
||||
function countBinary(str: string): BinaryInfo {
|
||||
let numOfZero: number = 0,
|
||||
numOfOne: number = 0;
|
||||
for (let s of str) {
|
||||
if (s === '0') {
|
||||
numOfZero++;
|
||||
} else {
|
||||
numOfOne++;
|
||||
}
|
||||
}
|
||||
return { numOfZero, numOfOne };
|
||||
}
|
||||
```
|
||||
|
||||
> 传统背包,三维数组法
|
||||
|
||||
```typescript
|
||||
type BinaryInfo = { numOfZero: number, numOfOne: number };
|
||||
function findMaxForm(strs: string[], m: number, n: number): number {
|
||||
/**
|
||||
dp[i][j][k]: 前i个物品中, 背包的0容量为j, 1容量为k, 最多能放的物品数量
|
||||
*/
|
||||
const goodsNum: number = strs.length;
|
||||
const dp: number[][][] = new Array(goodsNum).fill(0)
|
||||
.map(_ => new Array(m + 1)
|
||||
.fill(0)
|
||||
.map(_ => new Array(n + 1).fill(0))
|
||||
);
|
||||
const { numOfZero, numOfOne } = countBinary(strs[0]);
|
||||
for (let i = numOfZero; i <= m; i++) {
|
||||
for (let j = numOfOne; j <= n; j++) {
|
||||
dp[0][i][j] = 1;
|
||||
}
|
||||
}
|
||||
for (let i = 1; i < goodsNum; i++) {
|
||||
const { numOfZero, numOfOne } = countBinary(strs[i]);
|
||||
for (let j = 0; j <= m; j++) {
|
||||
for (let k = 0; k <= n; k++) {
|
||||
if (j < numOfZero || k < numOfOne) {
|
||||
dp[i][j][k] = dp[i - 1][j][k];
|
||||
} else {
|
||||
dp[i][j][k] = Math.max(dp[i - 1][j][k], dp[i - 1][j - numOfZero][k - numOfOne] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[dp.length - 1][m][n];
|
||||
};
|
||||
function countBinary(str: string): BinaryInfo {
|
||||
let numOfZero: number = 0,
|
||||
numOfOne: number = 0;
|
||||
for (let s of str) {
|
||||
if (s === '0') {
|
||||
numOfZero++;
|
||||
} else {
|
||||
numOfOne++;
|
||||
}
|
||||
}
|
||||
return { numOfZero, numOfOne };
|
||||
}
|
||||
```
|
||||
|
||||
> 回溯法(会超时)
|
||||
|
||||
```typescript
|
||||
function findMaxForm(strs: string[], m: number, n: number): number {
|
||||
/**
|
||||
思路:暴力枚举strs的所有子集,记录符合条件子集的最大长度
|
||||
*/
|
||||
let resMax: number = 0;
|
||||
backTrack(strs, m, n, 0, []);
|
||||
return resMax;
|
||||
function backTrack(
|
||||
strs: string[], m: number, n: number,
|
||||
startIndex: number, route: string[]
|
||||
): void {
|
||||
if (startIndex === strs.length) return;
|
||||
for (let i = startIndex, length = strs.length; i < length; i++) {
|
||||
route.push(strs[i]);
|
||||
if (isValidSubSet(route, m, n)) {
|
||||
resMax = Math.max(resMax, route.length);
|
||||
backTrack(strs, m, n, i + 1, route);
|
||||
}
|
||||
route.pop();
|
||||
}
|
||||
}
|
||||
};
|
||||
function isValidSubSet(strs: string[], m: number, n: number): boolean {
|
||||
let zeroNum: number = 0,
|
||||
oneNum: number = 0;
|
||||
strs.forEach(str => {
|
||||
for (let s of str) {
|
||||
if (s === '0') {
|
||||
zeroNum++;
|
||||
} else {
|
||||
oneNum++;
|
||||
}
|
||||
}
|
||||
});
|
||||
return zeroNum <= m && oneNum <= n;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
-----------------------
|
||||
|
Reference in New Issue
Block a user