3.json 7.2 KB
Newer Older
每日一练社区's avatar
test  
每日一练社区 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
{
   "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
}