函数 int findMax(int arr[], int low, int high) 计算数组中最大元素,其中数组 arr 从索引 low 到 high,( )正确实现了分治逻辑。
A.
if (low == high)
return arr[low];
int mid = (low + high) / 2;
return arr[mid];B.
if (low >= high)
return arr[low];
int mid = (low + high) / 2;
int leftMax = findMax(arr, low, mid - 1);
int rightMax = findMax(arr, mid, high);
return leftMax + rightMax;C.
if (low > high)
return 0;
int mid = low + (high - low) / 2;
int leftMax = findMax(arr, low, mid);
int rightMax = findMax(arr, mid + 1, high);
return leftMax * rightMax;D.
if (low == high)
return arr[low];
int mid = low + (high - low) / 2;
int leftMax = findMax(arr, low, mid);
int rightMax = findMax(arr, mid + 1, high);
return (leftMax > rightMax) ? leftMax : rightMax;仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】分治策略|递归实现|边界处理
1. 🎯 考纲定位:GESP 三级「递归与分治」模块。命题人卡住的是递归三要素缺失——大量考生只会写 if (low == high) return arr[low]; 直接返回,漏掉分与治两个核心步骤。这道题本质是考你是否真正理解分治算法的完整流程。
2. 🧠 解题思维:看到分治类题目,先想三步:① 何时停止递归(基准情形);② 如何划分(mid 计算方式,注意避免溢出);③ 如何合并(本题是取最大值)。基准情形必须是 low == high 而非 low > high,因为数组非空。划分用 low + (high - low) / 2 而非 (low + high) / 2 防止整数溢出。合并时左右区间为 [low, mid] 和 [mid+1, high],必须用 max 而非 + 或 *。
3. 🪤 陷阱拆解:
arr[mid],完全没做"分治",这是只背模板不读题的典型。low >= high 导致空数组返回 arr[low] 越界;更致命的是 return leftMax + rightMax,把"求最大"偷换成"求和",属于审题不清。low > high 返回 0 是死胡同(正常调用不会触发);leftMax * rightMax 把逻辑偷换成乘法,这是命题人专门设计的概念偷换。4. 🔄 反命题思维:如果把题目改成"求最小值",答案仍是 D,只需把 max 换成 min;如果改成"求和",D 中的合并步骤要改成 leftMax + rightMax。这类题刷到先问自己:这道题到底在考哪个步骤?是基准情形写错、划分越界、还是合并逻辑偷换? 命题人最喜欢在正确答案里塞一个"看起来像对的错误",让你掉进陷阱。