You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

临时变量是否会导致算法不再是原地算法?附连续最大列表算法示例

关于原地算法的判定:使用临时变量不影响原地属性

首先直接给结论:不会,使用单个临时变量的算法依然属于原地算法。

原地算法的核心定义

原地算法的关键特征是:使用的辅助空间与输入数据的规模无关,即空间复杂度为O(1)。这里的辅助空间指的是除了输入本身占用的内存之外,额外申请的存储空间。单个临时变量(比如你代码里的temp)属于常数级空间开销——不管输入数组的长度n是10还是10000,这个变量只占用固定大小的内存,完全符合原地算法的要求。

你的原地算法分析

先回顾你实现的原地算法代码:

void inConMax(int a[],int n) {
 int temp = -INFINITY;
 for (int i=0;i<n;i++) {
 if(temp>a[i]) {
 int k = temp;
 temp = a[i];
 a[i]=k;
 } else {
 temp=a[i];
 }
 }
}

这个算法通过维护一个临时变量temp来跟踪当前遍历到的最大元素,在遍历过程中直接修改原数组,没有申请任何与n相关的额外空间(比如非原地版本里的maxA数组)。

结合你的输入示例验证:
输入数组:{7,5,9,23,24,6,4,19,20}
遍历过程中数组的变化完全符合规则a(i+1)=max(a(i),a(i+1)),最终输出结果:7 7 9 23 24 24 6 19 20,算法逻辑是正确的。

对比非原地版本

你的非原地算法:

void conMax(int A[], int maxA[],int n) {
 for (int i=0;i<n;i++) {
 if (A[i]>=A[i-1]) { // 注:这里i=0时A[i-1]会越界,需要修正边界条件
 maxA[i]=A[i];
 } else {
 maxA[i]=A[i-1];
 }
 }
}

这里额外申请了一个长度为n的数组maxA,空间复杂度为O(n),不属于原地算法;而原地版本只用了O(1)的辅助空间,这正是原地算法的优势所在。

补充小提示

你的非原地算法存在一个边界问题:当i=0时,访问A[i-1]会导致数组越界,建议修正为:

void conMax(int A[], int maxA[],int n) {
 if (n == 0) return;
 maxA[0] = A[0];
 for (int i=1;i<n;i++) {
 if (A[i]>=maxA[i-1]) { // 用maxA[i-1]代替A[i-1],符合连续最大的规则
 maxA[i]=A[i];
 } else {
 maxA[i]=maxA[i-1];
 }
 }
}

内容的提问来源于stack exchange,提问作者trap28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:06:14