{ "question_id": 4, "question_title": "寻找两个正序数组的中位数", "difficulty": "困难", "question_content": "<p>给定两个大小分别为 <code>m</code> 和 <code>n</code> 的正序(从小到大)数组 <code>nums1</code> 和 <code>nums2</code>。请你找出并返回这两个正序数组的 <strong>中位数</strong> 。</p><p> </p><p><strong>示例 1:</strong></p><pre><strong>输入:</strong>nums1 = [1,3], nums2 = [2]<strong><br />输出:</strong>2.00000<strong><br />解释:</strong>合并数组 = [1,2,3] ,中位数 2</pre><p><strong>示例 2:</strong></p><pre><strong>输入:</strong>nums1 = [1,2], nums2 = [3,4]<strong><br />输出:</strong>2.50000<strong><br />解释:</strong>合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5</pre><p><strong>示例 3:</strong></p><pre><strong>输入:</strong>nums1 = [0,0], nums2 = [0,0]<strong><br />输出:</strong>0.00000</pre><p><strong>示例 4:</strong></p><pre><strong>输入:</strong>nums1 = [], nums2 = [1]<strong><br />输出:</strong>1.00000</pre><p><strong>示例 5:</strong></p><pre><strong>输入:</strong>nums1 = [2], nums2 = []<strong><br />输出:</strong>2.00000</pre><p> </p><p><strong>提示:</strong></p><ul>\t<li><code>nums1.length == m</code></li>\t<li><code>nums2.length == n</code></li>\t<li><code>0 <= m <= 1000</code></li>\t<li><code>0 <= n <= 1000</code></li>\t<li><code>1 <= m + n <= 2000</code></li>\t<li><code>-10<sup>6</sup> <= nums1[i], nums2[i] <= 10<sup>6</sup></code></li></ul><p> </p><p><strong>进阶:</strong>你能设计一个时间复杂度为 <code>O(log (m+n))</code> 的算法解决此问题吗?</p>", "topic_link": "https://bbs.csdn.net/topics/600469814", "cpp": "class Solution\n{\npublic:\n\tdouble findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2)\n\t{\n\t\tint nums1Size = nums1.size();\n\t\tint nums2Size = nums2.size();\n\t\tint na = nums1Size + nums2Size;\n\t\tint *ns = (int *)malloc(4 * na);\n\t\tint i = 0, j = 0, d = 0;\n\t\tint m = na / 2 + 1;\n\t\twhile (d < m)\n\t\t{\n\t\t\tint n;\n\t\t\tif (i < nums1Size && j < nums2Size)\n\t\t\t{\n\t\t\t\tn = (nums1[i] < nums2[j]) ? nums1[i++] : nums2[j++];\n\t\t\t}\n\t\t\telse if (i < nums1Size)\n\t\t\t{\n\t\t\t\tn = nums1[i++];\n\t\t\t}\n\t\t\telse if (j < nums2Size)\n\t\t\t{\n\t\t\t\tn = nums2[j++];\n\t\t\t}\n\t\t\tns[d++] = n;\n\t\t}\n\t\tif (na % 2)\n\t\t{\n\t\t\treturn ns[d - 1];\n\t\t}\n\t\treturn (ns[d - 1] + ns[d - 2]) / 2.0;\n\t}\n};", "java": "class Solution {\n\tpublic double findMedianSortedArrays(int[] nums1, int[] nums2) {\n\t\tint nums1Size = nums1.length;\n\t\tint nums2Size = nums2.length;\n\t\tint na = nums1Size + nums2Size;\n\t\tint[] ns = new int[4 * na];\n\t\tint i = 0, j = 0, d = 0;\n\t\tint m = na / 2 + 1;\n\t\twhile (d < m) {\n\t\t\tint n = 0;\n\t\t\tif (i < nums1Size && j < nums2Size) {\n\t\t\t\tn = (nums1[i] < nums2[j]) ? nums1[i++] : nums2[j++];\n\t\t\t} else if (i < nums1Size) {\n\t\t\t\tn = nums1[i++];\n\t\t\t} else if (j < nums2Size) {\n\t\t\t\tn = nums2[j++];\n\t\t\t}\n\t\t\tns[d++] = n;\n\t\t}\n\t\tif (na % 2 == 1) {\n\t\t\treturn ns[d - 1];\n\t\t}\n\t\treturn (ns[d - 1] + ns[d - 2]) / 2.0;\n\t}\n}", "js": "/**\n * @param {number[]} nums1\n * @param {number[]} nums2\n * @return {number}\n */\nvar findMedianSortedArrays = function(nums1, nums2) {\n let A, B, m, n, l, start, end, cutA, cutBB, cutB, L1, R1, L2, R2, U;\n \n if(nums2.length<nums1.length){\n [A, B] = [nums2, nums1];\n }else{\n [A, B] = [nums1, nums2];\n }\n\n console.log('===> case:', A, B);\n \n [m, n] = [A.length, B.length];\n l = m+n;\n\n if(m===0||n===0){\n if(m!==0){\n U = A;\n }\n\n if(n!==0){\n U = B;\n }\n\n if(U==null){\n return 0;\n }\n\n if(l%2===0){\n return (U[l/2-1]+U[l/2])/2;\n }else{\n return U[(l-1)/2];\n }\n\n }\n\n start = 0;\n end = m;\n while(start<=end){\n cutA = Math.floor((start+end)/2);\n cutBB = Math.floor((l+1)/2);\n cutB = cutBB-cutA;\n\n L1 = cutA===0 ? Number.NEGATIVE_INFINITY : A[cutA-1];\n R1 = cutA===m ? Number.MAX_VALUE : A[cutA];\n\n L2 = cutB===0 ? Number.NEGATIVE_INFINITY : B[cutB-1];\n R2 = cutB===n ? Number.MAX_VALUE : B[cutB];\n\n console.log(`-->[${start}, ${end}], [${cutA},${cutB}, ${cutBB}], L1:${L1}, R1:${R1}, L2:${L2}, R2:${R2}`);\n\n if(cutA>0 && L1>R2){\n end--;\n }else if(L2>R1){\n start++;\n }else{\n if(l%2===0){\n return (Math.max(L1,L2)+Math.min(R1,R2))/2;\n }else{\n return Math.max(L1, L2);\n }\n }\n }\n\n return 0;\n};\n\n\nconst cases = [\n // 0, 0\n [[],[],0],\n\n // 0, x\n [[],[2,4],3],\n [[],[2,4,5],4],\n [[1],[2,3],2],\n\n // // x, 0\n [[2,4],[],3],\n\n // // 1,1\n [[2],[3],2.5],\n \n // 2,1\n [[1,3],[2],2],\n\n // 1,2\n [[2],[1,3],2],\n [[4],[2,2],2], // 2,2,4=>2\n [[4],[2,4],4], // 2,4,4=>4\n [[4],[2,3],3],\n [[1],[2,3,4],2.5],\n [[1],[2,3,4,5,6],3.5],\n\n // 2,2\n [[1,2],[3,4],2.5],\n [[1,4],[2,3],2.5],\n [[2,3],[1,4],2.5],\n\n // 3,2\n [[2,3,4],[1,4],3], // 1,2,3,4,4\n [[1,2,3],[1,2],2], // 1,1,2,2,3\n [[1,2],[1,2,3],2], // 1,1,2,2,3\n\n // 3,3\n [[1,1,1],[1,1,1],1],\n [[1,2,2],[1,2,3],2],\n [[1,2,2, 2],[1,2, 2, 2],2], // 1 1 2 2 2\n\n // 4, 2\n [[2,3,4,5],[1,4],3.5], // 1,2,3,4,4,5\n [ [1,2,3,7,8],\n [4,5,6,9,10],\n 5.5\n ]\n];\n\nfor(const c of cases){\n console.log('');\n const v = findMedianSortedArrays(c[0], c[1]);\n console.log('v:',v);\n console.assert(v===c[2]); \n}\n\n\n\n\n\n\n\n", "python": "import math\nfrom typing import List\nclass Solution:\n\tdef findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:\n\t\tnums1Size = len(nums1)\n\t\tnums2Size = len(nums2)\n\t\tna = nums1Size + nums2Size\n\t\tns = []\n\t\ti = 0\n\t\tj = 0\n\t\tm = int(math.floor(na / 2 + 1))\n\t\twhile len(ns) < m:\n\t\t\tn = None\n\t\t\tif i < nums1Size and j < nums2Size:\n\t\t\t\tif nums1[i] < nums2[j]:\n\t\t\t\t\tn = nums1[i]\n\t\t\t\t\ti += 1\n\t\t\t\telse:\n\t\t\t\t\tn = nums2[j]\n\t\t\t\t\tj += 1\n\t\t\telif i < nums1Size:\n\t\t\t\tn = nums1[i]\n\t\t\t\ti += 1\n\t\t\telif j < nums2Size:\n\t\t\t\tn = nums2[j]\n\t\t\t\tj += 1\n\t\t\tns.append(n)\n\t\td = len(ns)\n\t\tif na % 2 == 1:\n\t\t\treturn ns[d - 1]\n\t\telse:\n\t\t\treturn (ns[d - 1] + ns[d - 2]) / 2.0\n# %%\ns = Solution()\nprint(s.findMedianSortedArrays([1,3], [2]))", "status": 1, "keywords": "数组,二分查找,分治", "license": { "cpp": "csdn.net", "python": "csdn.net", "java": "csdn.net" }, "notebook": { "cpp": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/3/3_cpp.ipynb?type=file", "python": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/3/3_python.ipynb?type=file", "java": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/leetcode/ipynb/3/3_java.ipynb?type=file" }, "notebook_enable": 1 }