mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 13:00:22 +08:00
Merge branch 'youngyangyang04:master' into master
This commit is contained in:
@ -416,6 +416,61 @@ var canPartition = function(nums) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TypeScript:
|
||||||
|
|
||||||
|
> 一维数组,简洁
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function canPartition(nums: number[]): boolean {
|
||||||
|
const sum: number = nums.reduce((pre, cur) => pre + cur);
|
||||||
|
if (sum % 2 === 1) return false;
|
||||||
|
const bagSize: number = sum / 2;
|
||||||
|
const goodsNum: number = nums.length;
|
||||||
|
const dp: number[] = new Array(bagSize + 1).fill(0);
|
||||||
|
for (let i = 0; i < goodsNum; i++) {
|
||||||
|
for (let j = bagSize; j >= nums[i]; j--) {
|
||||||
|
dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[bagSize] === bagSize;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
> 二维数组,易懂
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function canPartition(nums: number[]): boolean {
|
||||||
|
/**
|
||||||
|
weightArr = nums;
|
||||||
|
valueArr = nums;
|
||||||
|
bagSize = sum / 2; (sum为nums各元素总和);
|
||||||
|
按照0-1背包处理
|
||||||
|
*/
|
||||||
|
const sum: number = nums.reduce((pre, cur) => pre + cur);
|
||||||
|
if (sum % 2 === 1) return false;
|
||||||
|
const bagSize: number = sum / 2;
|
||||||
|
const weightArr: number[] = nums;
|
||||||
|
const valueArr: number[] = nums;
|
||||||
|
const goodsNum: number = weightArr.length;
|
||||||
|
const dp: number[][] = new Array(goodsNum)
|
||||||
|
.fill(0)
|
||||||
|
.map(_ => new Array(bagSize + 1).fill(0));
|
||||||
|
for (let i = weightArr[0]; i <= bagSize; i++) {
|
||||||
|
dp[0][i] = valueArr[0];
|
||||||
|
}
|
||||||
|
for (let i = 1; i < goodsNum; i++) {
|
||||||
|
for (let j = 0; j <= bagSize; j++) {
|
||||||
|
if (j < weightArr[i]) {
|
||||||
|
dp[i][j] = dp[i - 1][j];
|
||||||
|
} else {
|
||||||
|
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weightArr[i]] + valueArr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[goodsNum - 1][bagSize] === bagSize;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -351,6 +351,25 @@ const findTargetSumWays = (nums, target) => {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TypeScript:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function findTargetSumWays(nums: number[], target: number): number {
|
||||||
|
const sum: number = nums.reduce((pre, cur) => pre + cur);
|
||||||
|
if (Math.abs(target) > sum) return 0;
|
||||||
|
if ((target + sum) % 2 === 1) return 0;
|
||||||
|
const bagSize: number = (target + sum) / 2;
|
||||||
|
const dp: number[] = new Array(bagSize + 1).fill(0);
|
||||||
|
dp[0] = 1;
|
||||||
|
for (let i = 0; i < nums.length; i++) {
|
||||||
|
for (let j = bagSize; j >= nums[i]; j--) {
|
||||||
|
dp[j] += dp[j - nums[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[bagSize];
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -274,6 +274,21 @@ const change = (amount, coins) => {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TypeScript:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function change(amount: number, coins: number[]): number {
|
||||||
|
const dp: number[] = new Array(amount + 1).fill(0);
|
||||||
|
dp[0] = 1;
|
||||||
|
for (let i = 0, length = coins.length; i < length; i++) {
|
||||||
|
for (let j = coins[i]; j <= amount; j++) {
|
||||||
|
dp[j] += dp[j - coins[i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[amount];
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -277,5 +277,26 @@ var lastStoneWeightII = function (stones) {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TypeScript:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function lastStoneWeightII(stones: number[]): number {
|
||||||
|
const sum: number = stones.reduce((pre, cur) => pre + cur);
|
||||||
|
const bagSize: number = Math.floor(sum / 2);
|
||||||
|
const weightArr: number[] = stones;
|
||||||
|
const valueArr: number[] = stones;
|
||||||
|
const goodsNum: number = weightArr.length;
|
||||||
|
const dp: number[] = new Array(bagSize + 1).fill(0);
|
||||||
|
for (let i = 0; i < goodsNum; i++) {
|
||||||
|
for (let j = bagSize; j >= weightArr[i]; j--) {
|
||||||
|
dp[j] = Math.max(dp[j], dp[j - weightArr[i]] + valueArr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum - dp[bagSize] * 2;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||||
|
@ -340,6 +340,27 @@ function test_completePack2() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TypeScript:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 先遍历物品,再遍历背包容量
|
||||||
|
function test_CompletePack(): void {
|
||||||
|
const weight: number[] = [1, 3, 4];
|
||||||
|
const value: number[] = [15, 20, 30];
|
||||||
|
const bagSize: number = 4;
|
||||||
|
const dp: number[] = new Array(bagSize + 1).fill(0);
|
||||||
|
for (let i = 0; i < weight.length; i++) {
|
||||||
|
for (let j = weight[i]; j <= bagSize; j++) {
|
||||||
|
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(dp);
|
||||||
|
}
|
||||||
|
test_CompletePack();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||||
|
Reference in New Issue
Block a user