Skip to content

Commit 7a39c6c

Browse files
authored
feat: add solutions to lc problem: No.1137 (#4322)
No.1137.N-th Tribonacci Number
1 parent 06fa05e commit 7a39c6c

File tree

6 files changed

+340
-137
lines changed

6 files changed

+340
-137
lines changed

solution/1100-1199/1137.N-th Tribonacci Number/README.md

+116-45
Original file line numberDiff line numberDiff line change
@@ -132,43 +132,14 @@ func tribonacci(n int) int {
132132

133133
```ts
134134
function tribonacci(n: number): number {
135-
if (n === 0) {
136-
return 0;
137-
}
138-
if (n < 3) {
139-
return 1;
140-
}
141-
const a = [
142-
[1, 1, 0],
143-
[1, 0, 1],
144-
[1, 0, 0],
145-
];
146-
return pow(a, n - 3)[0].reduce((a, b) => a + b);
147-
}
148-
149-
function mul(a: number[][], b: number[][]): number[][] {
150-
const [m, n] = [a.length, b[0].length];
151-
const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
152-
for (let i = 0; i < m; ++i) {
153-
for (let j = 0; j < n; ++j) {
154-
for (let k = 0; k < b.length; ++k) {
155-
c[i][j] += a[i][k] * b[k][j];
156-
}
157-
}
158-
}
159-
return c;
160-
}
161-
162-
function pow(a: number[][], n: number): number[][] {
163-
let res = [[1, 1, 0]];
164-
while (n) {
165-
if (n & 1) {
166-
res = mul(res, a);
167-
}
168-
a = mul(a, a);
169-
n >>= 1;
135+
let [a, b, c] = [0, 1, 1];
136+
while (n--) {
137+
let d = a + b + c;
138+
a = b;
139+
b = c;
140+
c = d;
170141
}
171-
return res;
142+
return a;
172143
}
173144
```
174145

@@ -202,16 +173,18 @@ class Solution {
202173
* @return Integer
203174
*/
204175
function tribonacci($n) {
205-
if ($n == 0) {
206-
return 0;
207-
} elseif ($n == 1 || $n == 2) {
208-
return 1;
209-
}
210-
$dp = [0, 1, 1];
211-
for ($i = 3; $i <= $n; $i++) {
212-
$dp[$i] = $dp[$i - 1] + $dp[$i - 2] + $dp[$i - 3];
176+
$a = 0;
177+
$b = 1;
178+
$c = 1;
179+
180+
while ($n--) {
181+
$d = $a + $b + $c;
182+
$a = $b;
183+
$b = $c;
184+
$c = $d;
213185
}
214-
return $dp[$n];
186+
187+
return $a;
215188
}
216189
}
217190
```
@@ -413,6 +386,50 @@ func pow(a [][]int, n int) [][]int {
413386
}
414387
```
415388

389+
#### TypeScript
390+
391+
```ts
392+
function tribonacci(n: number): number {
393+
if (n === 0) {
394+
return 0;
395+
}
396+
if (n < 3) {
397+
return 1;
398+
}
399+
const a = [
400+
[1, 1, 0],
401+
[1, 0, 1],
402+
[1, 0, 0],
403+
];
404+
return pow(a, n - 3)[0].reduce((a, b) => a + b);
405+
}
406+
407+
function mul(a: number[][], b: number[][]): number[][] {
408+
const [m, n] = [a.length, b[0].length];
409+
const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
410+
for (let i = 0; i < m; ++i) {
411+
for (let j = 0; j < n; ++j) {
412+
for (let k = 0; k < b.length; ++k) {
413+
c[i][j] += a[i][k] * b[k][j];
414+
}
415+
}
416+
}
417+
return c;
418+
}
419+
420+
function pow(a: number[][], n: number): number[][] {
421+
let res = [[1, 1, 0]];
422+
while (n) {
423+
if (n & 1) {
424+
res = mul(res, a);
425+
}
426+
a = mul(a, a);
427+
n >>= 1;
428+
}
429+
return res;
430+
}
431+
```
432+
416433
#### JavaScript
417434

418435
```js
@@ -461,6 +478,60 @@ function pow(a, n) {
461478
}
462479
```
463480

481+
#### PHP
482+
483+
```php
484+
class Solution {
485+
/**
486+
* @param Integer $n
487+
* @return Integer
488+
*/
489+
function tribonacci($n) {
490+
if ($n === 0) {
491+
return 0;
492+
}
493+
if ($n < 3) {
494+
return 1;
495+
}
496+
497+
$a = [[1, 1, 0], [1, 0, 1], [1, 0, 0]];
498+
499+
$res = $this->pow($a, $n - 3);
500+
return array_sum($res[0]);
501+
}
502+
503+
private function mul($a, $b) {
504+
$m = count($a);
505+
$n = count($b[0]);
506+
$p = count($b);
507+
508+
$c = array_fill(0, $m, array_fill(0, $n, 0));
509+
510+
for ($i = 0; $i < $m; ++$i) {
511+
for ($j = 0; $j < $n; ++$j) {
512+
for ($k = 0; $k < $p; ++$k) {
513+
$c[$i][$j] += $a[$i][$k] * $b[$k][$j];
514+
}
515+
}
516+
}
517+
518+
return $c;
519+
}
520+
521+
private function pow($a, $n) {
522+
$res = [[1, 1, 0]];
523+
while ($n > 0) {
524+
if ($n & 1) {
525+
$res = $this->mul($res, $a);
526+
}
527+
$a = $this->mul($a, $a);
528+
$n >>= 1;
529+
}
530+
return $res;
531+
}
532+
}
533+
```
534+
464535
<!-- tabs:end -->
465536

466537
<!-- solution:end -->

solution/1100-1199/1137.N-th Tribonacci Number/README_EN.md

+116-45
Original file line numberDiff line numberDiff line change
@@ -132,43 +132,14 @@ func tribonacci(n int) int {
132132

133133
```ts
134134
function tribonacci(n: number): number {
135-
if (n === 0) {
136-
return 0;
137-
}
138-
if (n < 3) {
139-
return 1;
140-
}
141-
const a = [
142-
[1, 1, 0],
143-
[1, 0, 1],
144-
[1, 0, 0],
145-
];
146-
return pow(a, n - 3)[0].reduce((a, b) => a + b);
147-
}
148-
149-
function mul(a: number[][], b: number[][]): number[][] {
150-
const [m, n] = [a.length, b[0].length];
151-
const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
152-
for (let i = 0; i < m; ++i) {
153-
for (let j = 0; j < n; ++j) {
154-
for (let k = 0; k < b.length; ++k) {
155-
c[i][j] += a[i][k] * b[k][j];
156-
}
157-
}
158-
}
159-
return c;
160-
}
161-
162-
function pow(a: number[][], n: number): number[][] {
163-
let res = [[1, 1, 0]];
164-
while (n) {
165-
if (n & 1) {
166-
res = mul(res, a);
167-
}
168-
a = mul(a, a);
169-
n >>= 1;
135+
let [a, b, c] = [0, 1, 1];
136+
while (n--) {
137+
let d = a + b + c;
138+
a = b;
139+
b = c;
140+
c = d;
170141
}
171-
return res;
142+
return a;
172143
}
173144
```
174145

@@ -202,16 +173,18 @@ class Solution {
202173
* @return Integer
203174
*/
204175
function tribonacci($n) {
205-
if ($n == 0) {
206-
return 0;
207-
} elseif ($n == 1 || $n == 2) {
208-
return 1;
209-
}
210-
$dp = [0, 1, 1];
211-
for ($i = 3; $i <= $n; $i++) {
212-
$dp[$i] = $dp[$i - 1] + $dp[$i - 2] + $dp[$i - 3];
176+
$a = 0;
177+
$b = 1;
178+
$c = 1;
179+
180+
while ($n--) {
181+
$d = $a + $b + $c;
182+
$a = $b;
183+
$b = $c;
184+
$c = $d;
213185
}
214-
return $dp[$n];
186+
187+
return $a;
215188
}
216189
}
217190
```
@@ -413,6 +386,50 @@ func pow(a [][]int, n int) [][]int {
413386
}
414387
```
415388

389+
#### TypeScript
390+
391+
```ts
392+
function tribonacci(n: number): number {
393+
if (n === 0) {
394+
return 0;
395+
}
396+
if (n < 3) {
397+
return 1;
398+
}
399+
const a = [
400+
[1, 1, 0],
401+
[1, 0, 1],
402+
[1, 0, 0],
403+
];
404+
return pow(a, n - 3)[0].reduce((a, b) => a + b);
405+
}
406+
407+
function mul(a: number[][], b: number[][]): number[][] {
408+
const [m, n] = [a.length, b[0].length];
409+
const c = Array.from({ length: m }, () => Array.from({ length: n }, () => 0));
410+
for (let i = 0; i < m; ++i) {
411+
for (let j = 0; j < n; ++j) {
412+
for (let k = 0; k < b.length; ++k) {
413+
c[i][j] += a[i][k] * b[k][j];
414+
}
415+
}
416+
}
417+
return c;
418+
}
419+
420+
function pow(a: number[][], n: number): number[][] {
421+
let res = [[1, 1, 0]];
422+
while (n) {
423+
if (n & 1) {
424+
res = mul(res, a);
425+
}
426+
a = mul(a, a);
427+
n >>= 1;
428+
}
429+
return res;
430+
}
431+
```
432+
416433
#### JavaScript
417434

418435
```js
@@ -461,6 +478,60 @@ function pow(a, n) {
461478
}
462479
```
463480

481+
#### PHP
482+
483+
```php
484+
class Solution {
485+
/**
486+
* @param Integer $n
487+
* @return Integer
488+
*/
489+
function tribonacci($n) {
490+
if ($n === 0) {
491+
return 0;
492+
}
493+
if ($n < 3) {
494+
return 1;
495+
}
496+
497+
$a = [[1, 1, 0], [1, 0, 1], [1, 0, 0]];
498+
499+
$res = $this->pow($a, $n - 3);
500+
return array_sum($res[0]);
501+
}
502+
503+
private function mul($a, $b) {
504+
$m = count($a);
505+
$n = count($b[0]);
506+
$p = count($b);
507+
508+
$c = array_fill(0, $m, array_fill(0, $n, 0));
509+
510+
for ($i = 0; $i < $m; ++$i) {
511+
for ($j = 0; $j < $n; ++$j) {
512+
for ($k = 0; $k < $p; ++$k) {
513+
$c[$i][$j] += $a[$i][$k] * $b[$k][$j];
514+
}
515+
}
516+
}
517+
518+
return $c;
519+
}
520+
521+
private function pow($a, $n) {
522+
$res = [[1, 1, 0]];
523+
while ($n > 0) {
524+
if ($n & 1) {
525+
$res = $this->mul($res, $a);
526+
}
527+
$a = $this->mul($a, $a);
528+
$n >>= 1;
529+
}
530+
return $res;
531+
}
532+
}
533+
```
534+
464535
<!-- tabs:end -->
465536

466537
<!-- solution:end -->

0 commit comments

Comments
 (0)