double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n1 = nums1.size(), n2 = nums2.size(); if(n1 > n2) return findMedianSortedArrays(nums2, nums1); // n1 <= n2 int k = n1 + ((n2-n1+1)>>1); int l = 0, r = n1; while(l < r) { int mid = l + ((r-l+1)>>1); if(nums1[mid-1] > nums2[k-mid]) r = mid-1; else l = mid; } //l是中位线在第一个数组中左侧的位置 //k-l是中位线在第二个数组中左侧的位置 int leftMax1 = l==0 ? INT_MIN : nums1[l-1]; int rightMin1 = l==n1 ? INT_MAX : nums1[l]; int leftMax2 = k-l==0 ? INT_MIN : nums2[k-l-1]; int rightMin2 = k-l==n2 ? INT_MAX : nums2[k-l]; int t = max(leftMax1, leftMax2); if((n1+n2)%2 == 1) return (double)t; return (double)(t+min(rightMin1,rightMin2))/2.0; }
时间: 2024-03-31 07:38:44 浏览: 17
这是一段 C++ 代码,实现了求解两个有序数组的中位数的功能。函数名为 `findMedianSortedArrays`,接受两个参数,均为 `vector<int>` 类型的数组。
代码主要分为三个部分:
1. 对数组进行预处理,保证 `nums1` 的长度不大于 `nums2` 的长度。
2. 通过二分查找,找到一个位置 `l`,使得 `nums1[0]..nums1[l-1]` 和 `nums2[0]..nums2[k-l-1]` 的元素个数加起来刚好等于 `(n1+n2+1)/2`。
3. 根据 `l` 和 `k` 的值,分别计算出左半部分的最大值和右半部分的最小值,然后根据数组的长度是否为偶数,返回中位数。
需要注意的是,如果数组的长度为偶数,中位数需要取左半部分的最大值和右半部分的最小值的平均数。
值得一提的是,这段代码是使用了 C++ 的 STL 库中的 `vector` 类型,以及一些位运算和三目运算符来进行优化。
相关问题
vector<int>& nums的用法
`vector<int>& nums` 是一个引用类型的参数,用于传递一个整数类型的向量(vector)的引用给函数或方法。这样做的好处是可以避免复制整个向量,提高程序的效率。
通过引用传递,可以直接在函数或方法中修改原始向量而不创建副本。这意味着对 `nums` 所做的任何修改都会反映在原始向量上。
以下是一个示例,说明如何使用 `vector<int>& nums`:
```cpp
// 函数接受一个整数类型的向量引用作为参数
void modifyVector(vector<int>& nums) {
// 修改向量
nums.push_back(10);
nums.pop_back();
}
int main() {
vector<int> myVector = {1, 2, 3, 4, 5};
// 调用函数,并传递 myVector 的引用
modifyVector(myVector);
// 在函数中修改后,myVector 的内容也被修改
for (int num : myVector) {
cout << num << " ";
}
return 0;
}
```
输出结果为:`1 2 3 4 5`
在这个示例中,`modifyVector` 函数接受一个整数类型的向量引用 `nums`,并将一个新元素添加到向量的末尾,然后立即删除它。在 `main` 函数中调用 `modifyVector` 函数,并传递 `myVector` 的引用。因此,在修改向量后,`myVector` 的内容也被修改了。
vector<int> maxscoreindices(vector<int>& nums)
这个问题是要求找到一个数组中最大值的下标,如果有多个最大值,则返回所有最大值的下标。可以使用一个变量记录当前最大值,然后遍历数组,如果当前元素大于最大值,则更新最大值,并清空结果数组,将当前下标加入结果数组中。如果当前元素等于最大值,则将当前下标加入结果数组中。
以下是代码实现:
```
vector<int> maxscoreindices(vector<int>& nums) {
vector<int> res;
int maxScore = INT_MIN;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > maxScore) {
maxScore = nums[i];
res.clear();
res.push_back(i);
} else if (nums[i] == maxScore) {
res.push_back(i);
}
}
return res;
}
```