Skip to content

Commit e81c784

Browse files
Merge branch 'youngyangyang04:master' into master
2 parents 84335c5 + a1e9f25 commit e81c784

6 files changed

+183
-24
lines changed

problems/0222.完全二叉树的节点个数.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,5 +646,68 @@ func countNodes(_ root: TreeNode?) -> Int {
646646
}
647647
```
648648

649+
## Scala
650+
651+
递归:
652+
```scala
653+
object Solution {
654+
def countNodes(root: TreeNode): Int = {
655+
if(root == null) return 0
656+
1 + countNodes(root.left) + countNodes(root.right)
657+
}
658+
}
659+
```
660+
661+
层序遍历:
662+
```scala
663+
object Solution {
664+
import scala.collection.mutable
665+
def countNodes(root: TreeNode): Int = {
666+
if (root == null) return 0
667+
val queue = mutable.Queue[TreeNode]()
668+
var node = 0
669+
queue.enqueue(root)
670+
while (!queue.isEmpty) {
671+
val len = queue.size
672+
for (i <- 0 until len) {
673+
node += 1
674+
val curNode = queue.dequeue()
675+
if (curNode.left != null) queue.enqueue(curNode.left)
676+
if (curNode.right != null) queue.enqueue(curNode.right)
677+
}
678+
}
679+
node
680+
}
681+
}
682+
```
683+
684+
利用完全二叉树性质:
685+
```scala
686+
object Solution {
687+
def countNodes(root: TreeNode): Int = {
688+
if (root == null) return 0
689+
var leftNode = root.left
690+
var rightNode = root.right
691+
// 向左向右往下探
692+
var leftDepth = 0
693+
while (leftNode != null) {
694+
leftDepth += 1
695+
leftNode = leftNode.left
696+
}
697+
var rightDepth = 0
698+
while (rightNode != null) {
699+
rightDepth += 1
700+
rightNode = rightNode.right
701+
}
702+
// 如果相等就是一个满二叉树
703+
if (leftDepth == rightDepth) {
704+
return (2 << leftDepth) - 1
705+
}
706+
// 如果不相等就不是一个完全二叉树,继续向下递归
707+
countNodes(root.left) + countNodes(root.right) + 1
708+
}
709+
}
710+
```
711+
649712
-----------------------
650713
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0257.二叉树的所有路径.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,5 +702,35 @@ func binaryTreePaths(_ root: TreeNode?) -> [String] {
702702
}
703703
```
704704

705+
Scala:
706+
707+
递归:
708+
```scala
709+
object Solution {
710+
import scala.collection.mutable.ListBuffer
711+
def binaryTreePaths(root: TreeNode): List[String] = {
712+
val res = ListBuffer[String]()
713+
def traversal(curNode: TreeNode, path: ListBuffer[Int]): Unit = {
714+
path.append(curNode.value)
715+
if (curNode.left == null && curNode.right == null) {
716+
res.append(path.mkString("->")) // mkString函数: 将数组的所有值按照指定字符串拼接
717+
return // 处理完可以直接return
718+
}
719+
720+
if (curNode.left != null) {
721+
traversal(curNode.left, path)
722+
path.remove(path.size - 1)
723+
}
724+
if (curNode.right != null) {
725+
traversal(curNode.right, path)
726+
path.remove(path.size - 1)
727+
}
728+
}
729+
traversal(root, ListBuffer[Int]())
730+
res.toList
731+
}
732+
}
733+
```
734+
705735
-----------------------
706736
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,26 @@ var canPartition = function(nums) {
417417
```
418418

419419

420+
TypeScript:
421+
422+
```ts
423+
function canPartition(nums: number[]): boolean {
424+
const sum: number = nums.reduce((a: number, b: number): number => a + b);
425+
if (sum % 2 === 1) return false;
426+
const target: number = sum / 2;
427+
// dp[j]表示容量(总数和)为j的背包所能装下的数(下标[0, i]之间任意取)的总和(<= 容量)的最大值
428+
const dp: number[] = new Array(target + 1).fill(0);
429+
const n: number = nums.length;
430+
for (let i: number = 0; i < n; i++) {
431+
for (let j: number = target; j >= nums[i]; j--) {
432+
dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
433+
}
434+
}
435+
return dp[target] === target;
436+
};
437+
```
438+
439+
420440
C:
421441
二维dp:
422442
```c
@@ -575,6 +595,5 @@ function canPartition(nums: number[]): boolean {
575595

576596

577597

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

problems/0494.目标和.md

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -351,22 +351,26 @@ const findTargetSumWays = (nums, target) => {
351351
};
352352
```
353353

354-
TypeScript:
355354

356-
```typescript
355+
TypeScript:
356+
357+
```ts
357358
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--) {
359+
// 把数组分成两个组合left, right.left + right = sum, left - right = target.
360+
const sum: number = nums.reduce((a: number, b: number): number => a + b);
361+
if ((sum + target) % 2 || Math.abs(target) > sum) return 0;
362+
const left: number = (sum + target) / 2;
363+
364+
// 将问题转化为装满容量为left的背包有多少种方法
365+
// dp[i]表示装满容量为i的背包有多少种方法
366+
const dp: number[] = new Array(left + 1).fill(0);
367+
dp[0] = 1; // 装满容量为0的背包有1种方法(什么也不装)
368+
for (let i: number = 0; i < nums.length; i++) {
369+
for (let j: number = left; j >= nums[i]; j--) {
366370
dp[j] += dp[j - nums[i]];
367371
}
368372
}
369-
return dp[bagSize];
373+
return dp[left];
370374
};
371375
```
372376

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

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

280-
TypeScript:
281280

282-
```typescript
281+
TypeScript版本
282+
283+
```ts
283284
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]);
285+
const sum: number = stones.reduce((a: number, b:number): number => a + b);
286+
const target: number = Math.floor(sum / 2);
287+
const n: number = stones.length;
288+
// dp[j]表示容量(总数和)为j的背包所能装下的数(下标[0, i]之间任意取)的总和(<= 容量)的最大值
289+
const dp: number[] = new Array(target + 1).fill(0);
290+
for (let i: number = 0; i < n; i++ ) {
291+
for (let j: number = target; j >= stones[i]; j--) {
292+
dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);
293293
}
294294
}
295-
return sum - dp[bagSize] * 2;
295+
return sum - dp[target] - dp[target];
296296
};
297297
```
298298

299299

300300

301+
302+
303+
301304
-----------------------
302305
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/1365.有多少小于当前数字的数字.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,46 @@ var smallerNumbersThanCurrent = function(nums) {
217217
};
218218
```
219219

220+
TypeScript:
221+
222+
> 暴力法:
223+
224+
```typescript
225+
function smallerNumbersThanCurrent(nums: number[]): number[] {
226+
const length: number = nums.length;
227+
const resArr: number[] = [];
228+
for (let i = 0; i < length; i++) {
229+
let count: number = 0;
230+
for (let j = 0; j < length; j++) {
231+
if (nums[j] < nums[i]) {
232+
count++;
233+
}
234+
}
235+
resArr[i] = count;
236+
}
237+
return resArr;
238+
};
239+
```
240+
241+
> 排序+hash
242+
243+
```typescript
244+
function smallerNumbersThanCurrent(nums: number[]): number[] {
245+
const length: number = nums.length;
246+
const sortedArr: number[] = [...nums];
247+
sortedArr.sort((a, b) => a - b);
248+
const hashMap: Map<number, number> = new Map();
249+
for (let i = length - 1; i >= 0; i--) {
250+
hashMap.set(sortedArr[i], i);
251+
}
252+
const resArr: number[] = [];
253+
for (let i = 0; i < length; i++) {
254+
resArr[i] = hashMap.get(nums[i]);
255+
}
256+
return resArr;
257+
};
258+
```
259+
220260

221261

222262
-----------------------

0 commit comments

Comments
 (0)