题目

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数
算法的时间复杂度应该为 O(log (m+n)) 。

示例 1: :::info 输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2 ::: 示例 2: :::info 输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 :::
提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

题解一:

使用四指针动态的从两头去遍历两个数组,保证两遍的步数一直,最后的值则为中位数

  1. class Solution {
  2. public double findMedianSortedArrays(int[] nums1, int[] nums2) {
  3. // System.out.println("nums1:" + nums1[0]);
  4. // System.out.println("nums2:" + nums2[0]);
  5. int m = nums1.length;
  6. int n = nums2.length;
  7. boolean isEvenNumber = (m + n) % 2 == 0;
  8. int left = (m + n) / 2;
  9. int right = left;
  10. int index1Prefix = 0;
  11. int index1Suffix = m - 1;
  12. int index2Prefix = 0;
  13. int index2Suffix = n - 1;
  14. System.out.println("index1Prefix:" + index1Prefix);
  15. System.out.println("index2Prefix:" + index2Prefix);
  16. System.out.println("index1Suffix:" + index1Suffix);
  17. System.out.println("index2Suffix:" + index2Suffix);
  18. System.out.println("left:" + left);
  19. System.out.println("right:" + right);
  20. //最后一次操作的指针
  21. int lastPrefix = 0;
  22. int lastSuffix = 0;
  23. while (left > 0 || right > 0) {
  24. if(left > 0){
  25. if(index1Prefix >= m || m == 0){
  26. index2Prefix += 1;
  27. lastPrefix = 2;
  28. }else if(index2Prefix >= n || n == 0){
  29. index1Prefix += 1;
  30. lastPrefix = 1;
  31. }else if (nums1[index1Prefix] < nums2[index2Prefix]) {
  32. index1Prefix += 1;
  33. lastPrefix = 1;
  34. } else {
  35. index2Prefix += 1;
  36. lastPrefix = 2;
  37. }
  38. left -= 1;
  39. }
  40. if(right > 0){
  41. if(index1Suffix < 0 || m == 0){
  42. index2Suffix -= 1;
  43. lastSuffix = 2;
  44. }else if(index2Suffix < 0 || n == 0){
  45. index1Suffix -= 1;
  46. lastSuffix = 1;
  47. }else if (nums1[index1Suffix] > nums2[index2Suffix]) {
  48. index1Suffix -= 1;
  49. lastSuffix = 1;
  50. } else {
  51. index2Suffix -= 1;
  52. lastSuffix = 2;
  53. }
  54. right -= 1;
  55. }
  56. System.out.println("--------");
  57. System.out.println("index1Prefix:" + index1Prefix);
  58. System.out.println("index2Prefix:" + index2Prefix);
  59. System.out.println("index1Suffix:" + index1Suffix);
  60. System.out.println("index2Suffix:" + index2Suffix);
  61. }
  62. System.out.println("isEvenNumber:" + isEvenNumber);
  63. System.out.println("lastPrefix:" + lastPrefix);
  64. System.out.println("lastSuffix:" + lastSuffix);
  65. // System.out.println("left:" + left);
  66. // System.out.println("right:" + right);
  67. if(isEvenNumber){
  68. //偶数判断,中位数需要判断,最后两个值。
  69. int leftValue = lastPrefix == 1 ? nums1[index1Prefix - 1] : nums2[index2Prefix - 1];
  70. int rightValue = lastSuffix == 1 ? nums1[index1Suffix + 1] : nums2[index2Suffix + 1];
  71. return Double.valueOf(String.valueOf(leftValue + rightValue)) / 2;
  72. }else{
  73. //奇数,中位数还在数组中。
  74. if(index1Prefix == index1Suffix){
  75. return Double.valueOf(String.valueOf(nums1[index1Prefix]));
  76. }
  77. return Double.valueOf(String.valueOf(nums2[index2Prefix]));
  78. }
  79. }
  80. }