for(int i = 0;i < nums1.size();i++){ nums2.push_back(nums1[i]); } int len = nums2.size(); sort(nums2.begin(),nums2.end()); if(len % 2 != 0){ return nums2[(len/2) + 1]; } else{ float c = (nums2[len/2]+nums2[(len/2) + 1]) / 2; return c; }
时间: 2025-06-25 15:06:43 浏览: 12
### C++ Vector 合并排序并计算中位数的代码分析
以下是针对给定代码的功能、潜在问题及其优化建议:
#### 功能概述
该代码实现了两个已排序数组 `nums1` 和 `nums2` 的合并,并对其结果进行排序,随后计算合并后的数组的中位数。
---
#### 潜在问题与改进
##### 1. **性能问题**
当前实现采用了暴力方法,即先将两个数组合并再整体排序。这种方法的时间复杂度为 \(O((m+n)\log(m+n))\),其中 \(m\) 和 \(n\) 是输入数组的长度。这种效率较低的方法可以通过更高效的算法替代,例如双指针法[^3]。
**改进建议:**
可以采用双指针技术,在不实际合并数组的情况下找到第 \(\frac{m+n}{2}\) 小的元素(对于偶数长度)或者第 \(\frac{m+n+1}{2}\) 小的元素(对于奇数长度),从而降低时间复杂度至 \(O(m+n)\)[^3]。
```cpp
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int totalLength = nums1.size() + nums2.size();
if (totalLength % 2 == 0) {
return (findKthElement(nums1, nums2, totalLength / 2) +
findKthElement(nums1, nums2, totalLength / 2 - 1)) /
2.0;
} else {
return findKthElement(nums1, nums2, totalLength / 2);
}
}
private:
int findKthElement(const vector<int>& nums1, const vector<int>& nums2, int k) {
int index1 = 0, index2 = 0;
while (true) {
if (index1 >= nums1.size()) {
return nums2[index2 + k];
}
if (index2 >= nums2.size()) {
return nums1[index1 + k];
}
if (k == 0) {
return min(nums1[index1], nums2[index2]);
}
int half = (k + 1) / 2;
int newIndex1 = min(index1 + half, static_cast<int>(nums1.size())) - 1;
int newIndex2 = min(index2 + half, static_cast<int>(nums2.size())) - 1;
if (nums1[newIndex1] <= nums2[newIndex2]) {
k -= (newIndex1 - index1 + 1);
index1 = newIndex1 + 1;
} else {
k -= (newIndex2 - index2 + 1);
index2 = newIndex2 + 1;
}
}
}
};
```
此方法无需额外存储空间即可高效求解中位数。
---
##### 2. **内存管理问题**
原始代码中使用了迭代器逐个插入元素到目标向量中 (`push_back`),这可能导致多次动态扩容操作,增加了不必要的开销。
**改进建议:**
预先分配足够的容量以减少动态扩展次数,提升性能。
```cpp
// 改进版合并逻辑
void mergeVectors(vector<int>& target, const vector<int>& source) {
size_t originalSize = target.size();
target.reserve(originalSize + source.size());
for (const auto& elem : source) {
target.push_back(elem);
}
}
```
通过提前预留空间,避免频繁触发内部重新分配机制。
---
##### 3. **边界条件处理不足**
原代码未充分考虑极端情况下的行为表现,比如其中一个数组为空的情况。
**改进建议:**
增加对特殊情况的支持能力,简化后续流程控制逻辑。
```cpp
if (nums1.empty()) {
return calculateMedian(nums2);
} else if (nums2.empty()) {
return calculateMedian(nums1);
}
double calculateMedian(const vector<int>& nums) {
int mid = nums.size() / 2;
if (nums.size() % 2 == 0) {
return (nums[mid - 1] + nums[mid]) / 2.0;
} else {
return nums[mid];
}
}
```
这样可以在早期阶段快速返回结果而不需要执行冗余运算。
---
##### 4. **可读性和维护性较差**
现有结构较为紧凑且缺乏清晰分层设计,使得理解和调试变得困难。
**改进建议:**
分解功能模块,增强程序结构性和易理解程度。
```cpp
vector<int> mergeAndSort(const vector<int>& a, const vector<int>& b) {
vector<int> result(a);
result.insert(result.end(), b.begin(), b.end());
sort(result.begin(), result.end());
return result;
}
double getMedian(const vector<int>& merged) {
int sz = merged.size();
if (sz % 2 == 0) {
return (merged[sz / 2 - 1] + merged[sz / 2]) / 2.0;
} else {
return merged[sz / 2];
}
}
```
以上重构方式不仅提高了代码重用率还便于未来扩展需求接入。
---
### 总结
通过对原有代码深入剖析发现存在多个层面待完善之处,包括但不限于低效算法选用、资源浪费隐患以及异常情形应对缺失等问题。经过针对性调整后的新版本具备更高运行效能的同时兼顾良好编码习惯养成的重要性。
阅读全文
相关推荐



















