什么是原地题?

力扣支持团队发表于:2022年04月02日 中午 12:53:32更新于:2024年07月31日 中午 11:15:08

原地题是力扣中一类特殊的题目,这类题目通常对算法的空间复杂度有较高的要求,用户常常被限制使用额外的空间,并直接使代码模板中的输入变量返回结果。


原地算法的定义

在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的、固定数量的额外空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。


原地算法的示例

题目链接

0016253a76b2cc257512a552e6b5398

在该题中,题面中就有明确的表述:直接修改输入的二维矩阵,这意味着,我们将结果保存在自己创建的二维矩阵的变量中是无效的。

并且,这一类题的代码模板也与一般的题有所不同:

  • 一般题目通常使用函数返回值输出结果,原地题的函数通常没有返回值或返回值比实际输出的要少

  • 输入的变量通常为引用类型或指针

比如,在这题中,他的代码模板是:

void rotate(int** matrix, int matrixSize, int* matrixColSize){
    // 这是 C 语言的代码模板
}

可以看到,输入中的 matrix 是二维指针,我们直接通过指针修改变量 matrix 的值,这些修改都是能被系统获取的。

有些语言会提供引用类型的输入变量,比如:

class Solution
 {public:
     void rotate(vector<vector<int>>& matrix) {
         // 这是 C++ 的代码模板
     }
 };

这里定义 matrix 使用了 & 修饰符,因此它是引用类型。对引用类型的变量的修改,也都是能被系统获取的。

其他语言也是类似,这里不一一赘述。