leetcode第四题(寻找两个正序数组的中位数)
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int nums[] ;
int m = nums1.length;
int n = nums2.length;
nums = new int[m + n];
//这里数组nums1进行判定
if(m == 0){
if(n % 2 == 0){
return ((nums2[n / 2 - 1]) + nums2[n /2]) / 2;
}else{
return nums2[n /2];
}
}
//这里对nums2进行判定
if(n == 0){
if(m % 2 == 0){
return (nums1[m / 2 - 1] + nums1[m /2]) /2.0;
}else{
return nums1[m /2];
}
}
//实现两个数组的合并
int count = 0;
int i = 0,j = 0;
while(count != (m + n)){
//这里其实就是两个简单的保护机制 对两个数组为空的情况进行解决罢了 很显然m就不可能为0啊
if(i == m){
while(j != n){
//这里虽然都是 count和j均为0 但是一定要分开查询的
nums[count++] = nums2[j++];
}
break;
}
if(j == n){
while(i != m){
nums[count++] = nums1[i++];
}
break;
}
//将两个数组里面的大小的数 进行比较 然后一个个的添加到数组nums去
if(nums1[i] < nums2[j]){
//注意:这里的count和i会自己进行循环的自增
nums[count++] = nums1[i++];
}else{
nums[count++] = nums2[j++];
}
}
//最后一步 从有序数组里面去取出最后的答案
if(count % 2 == 0){
return (nums[count / 2 - 1] + nums[count /2]) / 2.0;
}else{
return nums[count / 2];
}
}
}
第二种解题思路:
- 我们并不需要将两个数组进行真的合并,我们只需要找到中位数在哪里就好了
- 怎么样将奇数和偶数的情况进行合并一下
- 用len表示合并数组后的长度
- 如果是奇数,我们我们只需要知道第(len + 1) /2 个数就可以了.如果遍历的话需要遍历 int (len / 2) + 1次.如果是偶数,我们需要知道第 len /2 个和 len /2 + 1个数
- 返回中位数的话,奇数需要最后的一次遍历就可以了,偶数需要在最后一次和上一次遍历的结果,所以我们用两个 left和 right 保存当前循环变量的结果,接下来为right的最后一次更新结果
- 循环中该怎么写,什么时候num1数组进行后移,什么时候nums2数组进行后移,用astart和bstart分别表示当前指向两个数组的位置,如果astart还没有到最后,并且此时a位置的数字小于b位置的次数,那么就可以后移了,.也就是astart < m && num1[astart] < num2[bstart[
- 但是如果b数组此时已经没有数字了,继续取数字B[bstart],则会越界,所以判断bstart是否大于数组长度了,这样
- 用len表示合并数组后的长度
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//我们并不需要直接吧两个数组进行合并
int m = nums1.length;
int n = nums2.length;
int len = m + n;
int left = -1;
int right = -1;
int aStart = 0;
int bStart = 0;
for(int i = 0;i <= len / 2;i++){
left = right;
if(aStart < m &&(bStart >= n || nums1[aStart] < nums2[bStart])){
right = nums1[aStart++];
}else{
right = nums2[bStart++];
}
}
if((len & 1) == 0){
return (double)(left + right)/2;
}else{
return right;
}
}
}