Skip to content

Files

Latest commit

3933d68 · Apr 29, 2023

History

History
This branch is 2 commits ahead of, 3024 commits behind doocs/leetcode:main.

2623.Memoize

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Apr 17, 2023
Apr 29, 2023
Apr 17, 2023

English Version

题目描述

请你编写一个函数,它接收另一个函数作为输入,并返回该函数的 记忆化 后的结果。

记忆函数 是一个对于相同的输入永远不会被调用两次的函数。相反,它将返回一个缓存值。

你可以假设有 3 个可能的输入函数:sumfibfactorial

  •  sum 接收两个整型参数 ab ,并返回 a + b
  •  fib 接收一个整型参数 n ,如果 n <= 1 则返回 1,否则返回 fib (n - 1) + fib (n - 2)
  •  factorial 接收一个整型参数 n ,如果 n <= 1 则返回  1 ,否则返回 factorial(n - 1) * n

 

示例 1:

输入:
"sum"
["call","call","getCallCount","call","getCallCount"]
[[2,2],[2,2],[],[1,2],[]]
输出:
[4,4,1,3,2]

解释:
const sum = (a, b) => a + b;
const memoizedSum = memoize(sum);
memoizedSum (2, 2);// 返回 4。sum() 被调用,因为之前没有使用参数 (2, 2) 调用过。
memoizedSum (2, 2);// 返回 4。没有调用 sum(),因为前面有相同的输入。
//总调用数: 1
memoizedSum(1、2);// 返回 3。sum() 被调用,因为之前没有使用参数 (1, 2) 调用过。
//总调用数: 2

示例 2:

输入:
"factorial"
["call","call","call","getCallCount","call","getCallCount"]
[[2],[3],[2],[],[3],[]]
输出:
[2,6,2,2,6,2]

解释:
const factorial = (n) => (n <= 1) ? 1 : (n * factorial(n - 1));
const memoFactorial = memoize(factorial);
memoFactorial(2); // 返回 2。
memoFactorial(3); // 返回 6。
memoFactorial(2); // 返回 2。 没有调用 factorial(),因为前面有相同的输入。
// 总调用数:2
memoFactorial(3); // 返回 6。 没有调用 factorial(),因为前面有相同的输入。
// 总调用数:2

示例 3:

输入:
"fib"
["call","getCallCount"]
[[5],[]]
输出:
[8,1]

解释:
fib(5) = 8
// 总调用数:1

 

Constraints:

  • 0 <= a, b <= 105
  • 1 <= n <= 10
  • at most 105 function calls
  • at most 105 attempts to access callCount
  • input function is sum, fib, or factorial

解法

方法一:哈希表

我们可以使用哈希表来存储函数的参数和返回值,当再次调用函数时,如果参数已经存在于哈希表中,则直接返回哈希表中的值,否则调用函数并将返回值存入哈希表中。

时间复杂度 O ( 1 ) ,空间复杂度 O ( n ) 。其中 n 为函数的参数个数。

TypeScript

type Fn = (...params: any) => any;

function memoize(fn: Fn): Fn {
    const cache: Record<any, any> = {};

    return function (...args) {
        if (args in cache) {
            return cache[args];
        }
        const result = fn(...args);
        cache[args] = result;
        return result;
    };
}

/**
 * let callCount = 0;
 * const memoizedFn = memoize(function (a, b) {
 *	 callCount += 1;
 *   return a + b;
 * })
 * memoizedFn(2, 3) // 5
 * memoizedFn(2, 3) // 5
 * console.log(callCount) // 1
 */

...