当前位置:   article > 正文

学渣带你刷Leetcode-0004.寻找两个有序数组的中位数_帮我用c语言实现以下功能: 假设两个大小为 m 和 n 的有序数组 number1 和 number

帮我用c语言实现以下功能: 假设两个大小为 m 和 n 的有序数组 number1 和 number2

题目描述

4.给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
来源:力扣(LeetCode
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

----------------------------------------------------------------------------------------------------------------------------------------------------------------

白话题目:

(1)中位数,这个概念您大概得了解一下,按顺序排列的一组数据中居于中间位置的数。

1 4 5,的话中间的数就是4,和平均值没啥关系。  一堆数要是偶数的话就是 中间位置的两个数的值得平均值。

(2)这题吧,一个数组有序想找中位数好找,可以用二分法,what?什么是二分法?想想曾经的一个电视节目,幸运52,

,最短时间猜商品价格,你打算咋猜,从1开始吗?NO,当然猜个你认为最差不多的了,主持人会根据你的答案说大了,小了,之后就按照提示继续猜吧。

(3)两数组和一起,还得有序,要是没有时间复杂度的要求,似乎还可以好处理一下,这个时间复杂度,是这个题的难度直线上升。

不过没事一会与大家交流一下,我们要做的是先能解决一下问题,之后再巧妙的解决这个问题。

------------------------------------------------------------------------------------------------------------------------

算法:

先看视频还是先看问题说明,随您【学渣带你刷Leetcode】B站  https://www.bilibili.com/video/BV1C7411y7gB?p=4

(一)不管思想怎么样,考虑一下你的会或者能写点什么。万一这里面的一些想法对做题有帮助呢

(1)合并后的数组的个数为nums1Size+nums2Size;

(2)中位数就应该是这么多数据中的“中间位置"----满足定义的意思啊。

(3)怎么找合并的序列的“中间位置呢”?

3.1先合并成有序序列

逐项比较大小,小的放入结果数组。谁的数据都用完了,就原样放进去吧。

3.2按照奇偶找位置就好了。

(二)结合二分思维,多思考,使劲想,想掉头发掉,没事,掉着掉着就习惯了。

(1)先想几个事

1.1  k=(n+m+1)/2;

       i+j=k;

1.2 一共n个位置,可以尝试i;

1.3 若出现A[i-1]<B[j],说明划分大了,需要把往左边移动

      若出出现B[j-1]>A[i],说明i划分的有点小,需要往大了调整

    这一切的调整都要满足i别取到边

1.4 满足条件时,不同的情况讨论,

i取0,取n不同的时候

普通时候,合并后数组奇偶的情况。

(2)上述的几件事再琢磨一遍。

C语言完成代码

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
  4. {
  5. double result;
  6. int total=nums1Size+nums2Size;
  7. int nums_result[total];
  8. int i=0,j=0,k=0;
  9. while (i<nums1Size&&j<nums2Size)
  10. {
  11. if (nums1[i]<nums2[j])
  12. {
  13. nums_result[k]=nums1[i];
  14. i++;
  15. k++;
  16. }
  17. else
  18. {
  19. nums_result[k]=nums2[j];
  20. j++;
  21. k++;
  22. }
  23. }//while
  24. if(i==nums1Size)
  25. {
  26. while (j<nums2Size)
  27. {
  28. nums_result[k]=nums2[j];
  29. k++;
  30. j++;
  31. }
  32. }
  33. if(j==nums2Size)
  34. {
  35. while (i<nums1Size)
  36. {
  37. nums_result[k]=nums1[i];
  38. k++;
  39. i++;
  40. }
  41. }
  42. int t=0;
  43. for( t=0; t<nums1Size+nums2Size; t++)
  44. {
  45. printf("%d ",nums_result[t]);
  46. }
  47. printf("\n");
  48. result= (total%2==0)?((nums_result[total/2-1]+nums_result[total/2])/2.0):nums_result[total/2];
  49. return result;
  50. }
  51. double findMedianSortedArrays2(int* nums1, int nums1Size, int* nums2, int nums2Size)
  52. {
  53. int n=nums1Size;
  54. int m=nums2Size;
  55. if(n>m)
  56. {
  57. return findMedianSortedArrays(nums2,nums2Size,nums1,nums1Size);
  58. }
  59. int L=0,R=n;
  60. int i,j;
  61. int k=(n+m+1)/2;
  62. while(L<=R)
  63. {
  64. i=(L+R)/2;
  65. j=k-i;
  66. if(i&&nums1[i-1]>nums2[j])
  67. {
  68. R=i-1;
  69. }
  70. else if(i!=n&&nums2[j-1]>nums1[i])
  71. {
  72. L=i+1;
  73. }
  74. else //满足了,找到了最小的划分
  75. {
  76. double min;
  77. if(i==0)
  78. min=nums2[j-1];
  79. else if(j==0)
  80. min=nums1[i-1];
  81. else
  82. min=(nums1[i-1]>nums2[j-1])?nums1[i-1]:nums2[j-1];
  83. //奇数
  84. if((n+m)%2)
  85. return min;
  86. double max;
  87. if(i==n)
  88. max=nums2[j];
  89. else if(j==m)
  90. max=nums1[i];
  91. else
  92. max=(nums1[i]<nums2[j])?nums1[i]:nums2[j];
  93. return (min+max)/2.0;
  94. }
  95. }
  96. return 0.0;
  97. }
  98. int main()
  99. {
  100. int nums1Size,nums2Size;
  101. printf("请输入数组1和2的个数\n");
  102. scanf("%d %d",&nums1Size,&nums2Size);
  103. printf("请输入数组1,例(1 2):");
  104. int nums1[nums1Size];
  105. int i;
  106. for(i=0; i<nums1Size; i++)
  107. {
  108. scanf("%d",&nums1[i]);
  109. }
  110. printf("请输入数组2,例(3 4):");
  111. int nums2[nums2Size];
  112. int j;
  113. for(j=0; j<nums2Size; j++)
  114. {
  115. scanf("%d",&nums2[j]);
  116. }
  117. double result=findMedianSortedArrays(nums1, nums1Size, nums2, nums2Size);
  118. double result2=findMedianSortedArrays2(nums1, nums1Size, nums2, nums2Size);
  119. printf("是不是最少得会写点啥?:%.1lf\n",result);
  120. printf("是时候表演真正的技术了:%.1lf\n",result2);
  121. return 0;
  122. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/567539
推荐阅读
相关标签
  

闽ICP备14008679号