Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 35666ef

Browse files
Merge branch 'youngyangyang04:master' into master
2 parents 10b440e + b78e750 commit 35666ef

6 files changed

+254
-0
lines changed

‎problems/0416.分割等和子集.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,61 @@ var canPartition = function(nums) {
416416
};
417417
```
418418

419+
TypeScript:
420+
421+
> 一维数组,简洁
422+
423+
```typescript
424+
function canPartition(nums: number[]): boolean {
425+
const sum: number = nums.reduce((pre, cur) => pre + cur);
426+
if (sum % 2 === 1) return false;
427+
const bagSize: number = sum / 2;
428+
const goodsNum: number = nums.length;
429+
const dp: number[] = new Array(bagSize + 1).fill(0);
430+
for (let i = 0; i < goodsNum; i++) {
431+
for (let j = bagSize; j >= nums[i]; j--) {
432+
dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
433+
}
434+
}
435+
return dp[bagSize] === bagSize;
436+
};
437+
```
438+
439+
> 二维数组,易懂
440+
441+
```typescript
442+
function canPartition(nums: number[]): boolean {
443+
/**
444+
weightArr = nums;
445+
valueArr = nums;
446+
bagSize = sum / 2; (sum为nums各元素总和);
447+
按照0-1背包处理
448+
*/
449+
const sum: number = nums.reduce((pre, cur) => pre + cur);
450+
if (sum % 2 === 1) return false;
451+
const bagSize: number = sum / 2;
452+
const weightArr: number[] = nums;
453+
const valueArr: number[] = nums;
454+
const goodsNum: number = weightArr.length;
455+
const dp: number[][] = new Array(goodsNum)
456+
.fill(0)
457+
.map(_ => new Array(bagSize + 1).fill(0));
458+
for (let i = weightArr[0]; i <= bagSize; i++) {
459+
dp[0][i] = valueArr[0];
460+
}
461+
for (let i = 1; i < goodsNum; i++) {
462+
for (let j = 0; j <= bagSize; j++) {
463+
if (j < weightArr[i]) {
464+
dp[i][j] = dp[i - 1][j];
465+
} else {
466+
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weightArr[i]] + valueArr[i]);
467+
}
468+
}
469+
}
470+
return dp[goodsNum - 1][bagSize] === bagSize;
471+
};
472+
```
473+
419474

420475

421476

‎problems/0474.一和零.md

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,129 @@ const findMaxForm = (strs, m, n) => {
323323
};
324324
```
325325

326+
TypeScript:
327+
328+
> 滚动数组,二维数组法
329+
330+
```typescript
331+
type BinaryInfo = { numOfZero: number, numOfOne: number };
332+
function findMaxForm(strs: string[], m: number, n: number): number {
333+
const goodsNum: number = strs.length;
334+
const dp: number[][] = new Array(m + 1).fill(0)
335+
.map(_ => new Array(n + 1).fill(0));
336+
for (let i = 0; i < goodsNum; i++) {
337+
const { numOfZero, numOfOne } = countBinary(strs[i]);
338+
for (let j = m; j >= numOfZero; j--) {
339+
for (let k = n; k >= numOfOne; k--) {
340+
dp[j][k] = Math.max(dp[j][k], dp[j - numOfZero][k - numOfOne] + 1);
341+
}
342+
}
343+
}
344+
return dp[m][n];
345+
};
346+
function countBinary(str: string): BinaryInfo {
347+
let numOfZero: number = 0,
348+
numOfOne: number = 0;
349+
for (let s of str) {
350+
if (s === '0') {
351+
numOfZero++;
352+
} else {
353+
numOfOne++;
354+
}
355+
}
356+
return { numOfZero, numOfOne };
357+
}
358+
```
359+
360+
> 传统背包,三维数组法
361+
362+
```typescript
363+
type BinaryInfo = { numOfZero: number, numOfOne: number };
364+
function findMaxForm(strs: string[], m: number, n: number): number {
365+
/**
366+
dp[i][j][k]: 前i个物品中, 背包的0容量为j, 1容量为k, 最多能放的物品数量
367+
*/
368+
const goodsNum: number = strs.length;
369+
const dp: number[][][] = new Array(goodsNum).fill(0)
370+
.map(_ => new Array(m + 1)
371+
.fill(0)
372+
.map(_ => new Array(n + 1).fill(0))
373+
);
374+
const { numOfZero, numOfOne } = countBinary(strs[0]);
375+
for (let i = numOfZero; i <= m; i++) {
376+
for (let j = numOfOne; j <= n; j++) {
377+
dp[0][i][j] = 1;
378+
}
379+
}
380+
for (let i = 1; i < goodsNum; i++) {
381+
const { numOfZero, numOfOne } = countBinary(strs[i]);
382+
for (let j = 0; j <= m; j++) {
383+
for (let k = 0; k <= n; k++) {
384+
if (j < numOfZero || k < numOfOne) {
385+
dp[i][j][k] = dp[i - 1][j][k];
386+
} else {
387+
dp[i][j][k] = Math.max(dp[i - 1][j][k], dp[i - 1][j - numOfZero][k - numOfOne] + 1);
388+
}
389+
}
390+
}
391+
}
392+
return dp[dp.length - 1][m][n];
393+
};
394+
function countBinary(str: string): BinaryInfo {
395+
let numOfZero: number = 0,
396+
numOfOne: number = 0;
397+
for (let s of str) {
398+
if (s === '0') {
399+
numOfZero++;
400+
} else {
401+
numOfOne++;
402+
}
403+
}
404+
return { numOfZero, numOfOne };
405+
}
406+
```
407+
408+
> 回溯法(会超时)
409+
410+
```typescript
411+
function findMaxForm(strs: string[], m: number, n: number): number {
412+
/**
413+
思路:暴力枚举strs的所有子集,记录符合条件子集的最大长度
414+
*/
415+
let resMax: number = 0;
416+
backTrack(strs, m, n, 0, []);
417+
return resMax;
418+
function backTrack(
419+
strs: string[], m: number, n: number,
420+
startIndex: number, route: string[]
421+
): void {
422+
if (startIndex === strs.length) return;
423+
for (let i = startIndex, length = strs.length; i < length; i++) {
424+
route.push(strs[i]);
425+
if (isValidSubSet(route, m, n)) {
426+
resMax = Math.max(resMax, route.length);
427+
backTrack(strs, m, n, i + 1, route);
428+
}
429+
route.pop();
430+
}
431+
}
432+
};
433+
function isValidSubSet(strs: string[], m: number, n: number): boolean {
434+
let zeroNum: number = 0,
435+
oneNum: number = 0;
436+
strs.forEach(str => {
437+
for (let s of str) {
438+
if (s === '0') {
439+
zeroNum++;
440+
} else {
441+
oneNum++;
442+
}
443+
}
444+
});
445+
return zeroNum <= m && oneNum <= n;
446+
}
447+
```
448+
326449

327450

328451
-----------------------

‎problems/0494.目标和.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,25 @@ const findTargetSumWays = (nums, target) => {
351351
};
352352
```
353353

354+
TypeScript:
355+
356+
```typescript
357+
function findTargetSumWays(nums: number[], target: number): number {
358+
const sum: number = nums.reduce((pre, cur) => pre + cur);
359+
if (Math.abs(target) > sum) return 0;
360+
if ((target + sum) % 2 === 1) return 0;
361+
const bagSize: number = (target + sum) / 2;
362+
const dp: number[] = new Array(bagSize + 1).fill(0);
363+
dp[0] = 1;
364+
for (let i = 0; i < nums.length; i++) {
365+
for (let j = bagSize; j >= nums[i]; j--) {
366+
dp[j] += dp[j - nums[i]];
367+
}
368+
}
369+
return dp[bagSize];
370+
};
371+
```
372+
354373

355374

356375
-----------------------

‎problems/0518.零钱兑换II.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,21 @@ const change = (amount, coins) => {
274274
}
275275
```
276276

277+
TypeScript:
278+
279+
```typescript
280+
function change(amount: number, coins: number[]): number {
281+
const dp: number[] = new Array(amount + 1).fill(0);
282+
dp[0] = 1;
283+
for (let i = 0, length = coins.length; i < length; i++) {
284+
for (let j = coins[i]; j <= amount; j++) {
285+
dp[j] += dp[j - coins[i]];
286+
}
287+
}
288+
return dp[amount];
289+
};
290+
```
291+
277292

278293

279294
-----------------------

‎problems/1049.最后一块石头的重量II.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,5 +277,26 @@ var lastStoneWeightII = function (stones) {
277277
};
278278
```
279279

280+
TypeScript:
281+
282+
```typescript
283+
function lastStoneWeightII(stones: number[]): number {
284+
const sum: number = stones.reduce((pre, cur) => pre + cur);
285+
const bagSize: number = Math.floor(sum / 2);
286+
const weightArr: number[] = stones;
287+
const valueArr: number[] = stones;
288+
const goodsNum: number = weightArr.length;
289+
const dp: number[] = new Array(bagSize + 1).fill(0);
290+
for (let i = 0; i < goodsNum; i++) {
291+
for (let j = bagSize; j >= weightArr[i]; j--) {
292+
dp[j] = Math.max(dp[j], dp[j - weightArr[i]] + valueArr[i]);
293+
}
294+
}
295+
return sum - dp[bagSize] * 2;
296+
};
297+
```
298+
299+
300+
280301
-----------------------
281302
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

‎problems/背包问题理论基础完全背包.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,27 @@ function test_completePack2() {
340340
}
341341
```
342342

343+
TypeScript:
344+
345+
```typescript
346+
// 先遍历物品,再遍历背包容量
347+
function test_CompletePack(): void {
348+
const weight: number[] = [1, 3, 4];
349+
const value: number[] = [15, 20, 30];
350+
const bagSize: number = 4;
351+
const dp: number[] = new Array(bagSize + 1).fill(0);
352+
for (let i = 0; i < weight.length; i++) {
353+
for (let j = weight[i]; j <= bagSize; j++) {
354+
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
355+
}
356+
}
357+
console.log(dp);
358+
}
359+
test_CompletePack();
360+
```
361+
362+
363+
343364

344365
-----------------------
345366
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /