[Swift]LeetCode4. 两个排序数组的中位数 | Median of Two Sorted Arrays
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9858777.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3] nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
给定两个大小为 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
40ms
1 lass Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 var i = 0, j = 0 4 var m = nums1.count, n = nums2.count 5 var arr1 = nums1, arr2 = nums2 6 if m > n { 7 swap(&m, &n) 8 swap(&arr1, &arr2) 9 } 10 let half = (m + n) / 2 11 12 var leftMax = 0, rightMin = 0 13 14 // 长度为m的数组分割,有m+1种分割方法,所以 0 <= i <= m 15 var min = 0, max = m 16 while min <= max { 17 i = (min + max) / 2 18 j = half - i 19 if i > 0 && arr1[i-1] > arr2[j] { 20 max = i - 1 21 } else if i < m && arr2[j-1] > arr1[i] { 22 min = i + 1 23 } else { 24 // arr1 所有元素都在左边,则min(Right) = arr2[j] 25 if i == m { 26 rightMin = arr2[j] 27 } else if j == n { 28 rightMin = arr1[i] 29 } else { 30 rightMin = arr1[i] > arr2[j] ? arr2[j] : arr1[i] 31 } 32 33 if (m + n) % 2 == 1 { 34 return Double(rightMin) 35 } 36 37 if i == 0 { 38 leftMax = arr2[j - 1] 39 } else if j == 0 { 40 leftMax = arr1[i - 1] 41 } else { 42 leftMax = arr1[i-1] > arr2[j-1] ? arr1[i-1] : arr2[j-1] 43 } 44 return Double(leftMax + rightMin) / 2.0 45 } 46 } 47 return 0 48 } 49 }
44ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 var A = nums1 4 var B = nums2 5 if A.count > B.count { 6 B = nums1 7 A = nums2 8 } 9 let m = A.count, n = B.count 10 var iMin = 0, iMax = m 11 while iMin <= iMax { 12 var i = 0, j = 0 13 if (iMin + iMax)%2 == 0 { 14 i = (iMin + iMax) / 2 15 } else { 16 i = (iMin + iMax - 1) / 2 17 } 18 19 if (m+n)%2 == 0 { 20 j = (m + n)/2 - i 21 } else { 22 j = (m + n + 1)/2 - i 23 } 24 25 if i < iMax && A[i] < B[j-1]{ 26 iMin = i + 1 27 } else if i > iMin && B[j] < A[i-1]{ 28 iMax = i-1 29 } else { 30 var maxLeft = 0 31 var minRight = 0 32 if i == 0 { 33 maxLeft = B[j-1] 34 } else if j == 0 { 35 maxLeft = A[i-1] 36 } else { 37 maxLeft = max(B[j-1], A[i-1]) 38 } 39 40 if i == m { 41 if j < n { 42 minRight = B[j] 43 } 44 } else if j == n { 45 if i < m { 46 minRight = A[i] 47 } 48 } else { 49 minRight = min(B[j],A[i]) 50 } 51 52 if (A.count + B.count)%2 == 0 { 53 return Double(minRight+maxLeft) / 2 54 } else { 55 return Double(maxLeft) 56 } 57 } 58 } 59 return 0.0 60 } 61 }
48ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 if nums1.count == 0 { 4 return medianOfSortedArray(nums2) 5 } else if nums2.count == 0 { 6 return medianOfSortedArray(nums1) 7 } 8 9 var index1: Int = 0 10 var index2: Int = 0 11 var sortedCombinedArray: [Int] = [] 12 while index1 < nums1.count && index2 < nums2.count { 13 if nums1[index1] < nums2[index2] { 14 sortedCombinedArray.append(nums1[index1]) 15 index1 += 1 16 } else { 17 sortedCombinedArray.append(nums2[index2]) 18 index2 += 1 19 } 20 } 21 22 if index1 == nums1.count { 23 sortedCombinedArray += nums2[index2...] 24 } else { 25 sortedCombinedArray += nums1[index1...] 26 } 27 28 return self.medianOfSortedArray(sortedCombinedArray) 29 } 30 31 func medianOfSortedArray(_ sortedArray: [Int]) -> Double { 32 if sortedArray.count == 1 { 33 return Double(sortedArray[0]) 34 } 35 36 if sortedArray.count % 2 == 1 { 37 let medianIndex = Int(sortedArray.count / 2) 38 return Double(sortedArray[medianIndex]) 39 } else { 40 let medianIndex = Int(sortedArray.count / 2) 41 return Double(sortedArray[medianIndex] + sortedArray[medianIndex-1]) / 2.0 42 } 43 } 44 }
48ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 var arr1 = nums1,arr2 = nums2 4 if arr1.count > arr2.count { 5 arr1 = nums2 6 arr2 = nums1 7 } 8 var iMin = 0,iMax = arr1.count,halfLen = (arr1.count + arr2.count + 1)/2 9 while iMin <= iMax { 10 let i = (iMin + iMax)/2 11 let j = halfLen - i 12 if i < iMax && arr2[j - 1] > arr1[i] { 13 iMin = i + 1 14 }else if i > iMin && arr1[i - 1] > arr2[j] { 15 iMax = i - 1 16 }else { 17 var maxLeft = 0 18 if i == 0 { 19 maxLeft = arr2[j - 1] 20 }else if j == 0 { 21 maxLeft = arr1[i - 1] 22 }else{ 23 maxLeft = max(arr1[i - 1], arr2[j - 1]) 24 } 25 26 if (arr1.count + arr2.count)%2 == 1 { 27 return Double(maxLeft) 28 } 29 var maxRight = 0 30 if i == arr1.count { 31 maxRight = arr2[j] 32 }else if j == arr2.count { 33 maxRight = arr1[i] 34 }else{ 35 maxRight = min(arr2[j], arr1[i]) 36 } 37 return (Double(maxLeft) + Double(maxRight))/2 38 } 39 } 40 return 0 41 } 42 }
52ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 let total = nums1.count + nums2.count 4 if total % 2 == 1 { 5 return findKth(nums1, nums1.count, nums2, nums2.count, total / 2 + 1) 6 } else { 7 return (findKth(nums1, nums1.count, nums2, nums2.count, total / 2) + findKth(nums1, nums1.count, nums2, nums2.count, total / 2 + 1)) / 2 8 } 9 } 10 11 private func findKth(_ nums1: [Int], _ m: Int, _ nums2: [Int], _ n: Int, _ k: Int) -> Double { 12 if m > n { 13 return findKth(nums2, n, nums1, m, k) 14 } 15 16 if m == 0 { 17 return Double(nums2[k - 1]) 18 } 19 20 if k == 1 { 21 return Double(min(nums1[0], nums2[0])) 22 } 23 24 let i = min(k / 2, m) 25 let j = k - i 26 if nums1[i - 1] < nums2[j - 1] { 27 return findKth(Array(nums1[i..<m]), m - i, nums2, n, k - i) 28 } else if nums1[i - 1] > nums2[j - 1] { 29 return findKth(nums1, m, Array(nums2[j..<n]), n-j, k - j) 30 } else { 31 return Double(nums1[i - 1]) 32 } 33 } 34 }
60ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 var nums = nums1 + nums2 4 nums.sort(by: <) 5 6 let size = nums.count 7 let mid: Int = size / 2 8 if size % 2 == 0 { 9 return Double((nums[mid - 1] + nums[mid])) / 2 10 } else { 11 return Double(nums[mid]) 12 } 13 } 14 }
64ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 let combinedNums = nums1 + nums2 4 let sortedCombinedNums = combinedNums.sorted { $0 > $1 } 5 if sortedCombinedNums.count % 2 == 0 { // even 6 let count = sortedCombinedNums.count 7 let middleIndex2 = count / 2 8 let middleIndex1 = middleIndex2 - 1 9 let middleSum = sortedCombinedNums[middleIndex1] + sortedCombinedNums[middleIndex2] 10 let median = Double(middleSum) / 2 11 return median 12 } else { // odd 13 let middleIndex = (sortedCombinedNums.count / 2) 14 let median = Double(sortedCombinedNums[middleIndex]) 15 return median 16 } 17 } 18 }
72ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 let merged = (nums1 + nums2).sorted(by: {return $0 < $1}) 4 let count = merged.count 5 guard count > 0 else { return 0 } 6 if count % 2 == 0 { 7 let a = Double(merged[Int(count/2)]) 8 let b = Double(merged[Int(count/2) - 1]) 9 return (a + b) / 2 10 11 } else { 12 return Double(merged[Int(count-1)/2]) 13 14 } 15 } 16 }
84ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 var nums = nums1 + nums2 4 nums.sort() 5 if nums.count == 0 { 6 return 0 7 } else { 8 if nums.count % 2 == 0 { 9 return (Double(nums[nums.count/2]) + Double(nums[nums.count/2-1]))/2 10 } else { 11 return Double(nums[nums.count/2]) 12 } 13 } 14 } 15 }
88ms
1 class Solution { 2 func findMedianSortedArrays(_ nums1: [Int], _ nums2: [Int]) -> Double { 3 var totalArray = nums1 + nums2 4 var resultArray = totalArray.sorted() 5 6 if resultArray.count % 2 == 1 { 7 var midPoint = (resultArray.count - 1) / 2 8 return Double(resultArray[midPoint]) 9 10 } else { 11 var left = resultArray.count / 2 - 1 12 var right = resultArray.count / 2 13 print(right) 14 return Double((Double(resultArray[left]) + Double(resultArray[right])) / 2) 15 } 16 } 17 }