> 簡潔易懂講清原理,講不清你來打我~

輸入兩個遞增陣列,輸出中位數
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/25550994642144228e986284b7e0b8e6.png)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/482fc490261b434188df19c11e4db07c.png)

> 雙指標/合併

p1指向nums1,p2指向nums2,不斷選出較小的生成新陣列,當較短的到結尾後只取較長陣列剩餘元素,根據奇偶輸出中位數

```cpp
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int p1=0,p2=0;
vector<int>nums3;
while(p1<nums1.size()||p2<nums2.size()){
if(p1==nums1.size()){
nums3.push_back(nums2[p2]);
p2++;
}else if(p2==nums2.size()){
nums3.push_back(nums1[p1]);
p1++;
}
else if(nums1[p1]<nums2[p2]){
nums3.push_back(nums1[p1]);
p1++;
}else{
nums3.push_back(nums2[p2]);
p2++;
}
}
int n=nums3.size();
double ans=0.0;
if(n%2==0){
ans=(nums3[n/2-1]+nums3[n/2])/2.0;
}else{
ans=nums3[n/2];
}
return ans;
}
};
```

> 雙指標二分跳躍/第k小

找第k小
明確left1、left2是起點,mid1=left1+k/2-1
如果nums1[mid1]<nums2[mid2],哪怕最極端的[left2,mid2-1]都小於k,也有[left1,mid1]小於k
mid1最大為m-1
如果left=m,即第一個陣列沒有元素,直接返回第二個陣列第k小的元素;如果k=1,返回兩陣列較小的起點

```cpp
class Solution {
public:
int findK(const vector<int>& nums1, const vector<int>& nums2, int k) {
int m = nums1.size();
int n = nums2.size();
int left1 = 0, left2 = 0;
while (true) {
if (left1 == m) {
return nums2[left2 + k - 1];
}
if (left2 == n) {
return nums1[left1 + k - 1];
}
if (k == 1) {
return min(nums1[left1], nums2[left2]);
}
int mid1 = min(left1 + k / 2 - 1, m - 1);
int mid2 = min(left2 + k / 2 - 1, n - 1);
if (nums1[mid1] <= nums2[mid2]) {
k -= mid1 - left1 + 1;
left1 = mid1 + 1;
}
else {
k -= mid2 - left2 + 1;
left2 = mid2 + 1;
}
}
}

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int totalLength = nums1.size() + nums2.size();
if (totalLength % 2 == 1) {
return findK(nums1, nums2, (totalLength + 1) / 2);
}
else {
return (findK(nums1, nums2, totalLength / 2) + findK(nums1, nums2, totalLength / 2 + 1)) / 2.0;
}
}
};

```

> 喜歡簡潔易懂還能講清楚原理部落格的小夥伴就關注關注這個非常高產的博主呀,下次再會~