关于Leetcode的刷题方法,在网上看了很多,每个人都有着不同的见解。作为Leetcode小白,我还是决定用最原始的方法进行刷题,即把每一题的思路都记录下来,虽然比较耗时间,但是个人感觉这样子的方法会让我对题目有更深入的了解。希望能在该专栏中记录下刷题过程中遇到的大大小小的问题🍊。
题目描述
解题思路
- 对于本题而言,看到两个数组本身是有序的,我第一时间想到的方法就是合并两个数组,用的也是经典的合并方法,即首先通过两个下标指向两个数组的开端,然后依次比较两个指向的元素大小,我们取较小的值放入新数组中,同时往后挪动一个元素。
- 当某一个下标指向一个数组的末尾的时候,我们就要单独判断另一个下标是否到达数组的末尾,如果没到的话,则将剩余的元素补充道新数组的后面即可。
- 得到排序好的新数组后,通过判断是奇数还是偶数来得到最终的中位数即可。
题目代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size(),n = nums2.size(); //得到两个数组的长度
int *result = new int[m+n]; //创建新数组
int idx1 = 0,idx2 = 0,index = 0; //构建三个下标,分别指向两个数组以及新构建的数组
while(idx1 <m && idx2 < n && m > 0 && n > 0){ //表示两个下标都未到达数组的末尾
if(nums1[idx1] < nums2[idx2]){ //选择较小的值加入道新数组中
result[index++] = nums1[idx1++];
}
else if(nums1[idx1] > nums2[idx2]){
result[index++] = nums2[idx2++];
}
else{ //若两个值相等,则依次加入新数组中
result[index++] = nums1[idx1++];
result[index++] = nums2[idx2++];
}
}
//若下标idx1仍未到达数组末尾,则将剩余的元素补到新数组中
while(idx1 < m && m > 0){
result[index++] = nums1[idx1++];
}
//若下标idx2仍未到达数组末尾,则将剩余的元素补到新数组中
while(idx2 < n && n > 0){
result[index++] = nums2[idx2++];
}
int mid = (m+n); //中位数
double last; //最终结果
if(mid % 2 == 0){ //偶数的情况
last = double(result[mid/2] + result[mid/2 - 1]) / 2;
}
else{ //奇数的情况
last = double(result[mid/2]);
}
return last; //返回最终结果
}
};