回应模式 - No.65945146


No.65945146 - 技术宅


无标题无名氏No.65945146 只看PO

2025-04-28(一)08:18:47 ID:1th3CTn 回应

各位大佬好, 本肥刚刚开始接触力扣, 为什么这道题运行能通过但是提交一直显示超过时间限制啊? 请各位大佬赐教!
我的解法如下, 我的这个解法时间复杂度是O(log(min(m,n)))
------------------------------------------------------------
题目: 给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数 。
算法的时间复杂度应该为
O(log(m + n)) 。

示例1:

输入:nums1 = [1, 3], nums2 = 2[0,2]
输出:2.00000
解释:合并数组 = [1, 2, 3] ,中位数 2

示例2:

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

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


我的解法:

class Solution:

def findMedianSortedArrays(self, nums1, nums2) -> float:



if len(nums1) > len(nums2):

return self.findMedianSortedArrays(nums2, nums1)



total = len(nums1) + len(nums2)

if total % 2 == 0:

is_even_total = True

else:

is_even_total = False



list1_with_sentinel = [float('-inf')] + nums1 + [float('inf')]

list2_with_sentinel = [float('-inf')] + nums2 + [float('inf')]



list1_left = 0

list1_right = len(list1_with_sentinel) - 1



while True:

list1_mid = (list1_left + list1_right) // 2

list2_ptr = total // 2 - list1_mid



list1_current_item = list1_with_sentinel[list1_mid]

list1_next_item = list1_with_sentinel[list1_mid + 1]

list2_current_item = list2_with_sentinel[list2_ptr]

list2_next_item = list2_with_sentinel[list2_ptr + 1]



if list1_current_item <= list2_next_item and list2_current_item <= list1_next_item:

if is_even_total:

left_part_max = max(list1_current_item, list2_current_item)

right_part_min = min(list1_next_item, list2_next_item)

median = (left_part_max + right_part_min) / 2

else:

right_part_min = min(list1_next_item, list2_next_item)

median = right_part_min

break

if list1_next_item < list2_current_item:

list1_left = list1_mid

if list2_next_item < list1_current_item:

list1_right = list2_ptr

return median

无标题无名氏No.65959708

2025-04-29(二)19:48:01 ID: oComTmr

>>No.65959165
是特定用例会死循环,你要找到那个会导致死循环的用例,然后本地调试( ゚∀。)

无标题无名氏No.65961890

2025-04-30(三)00:05:09 ID: Gs2SdhS

>>No.65953848
这个其实算算法竞赛的东西,大概就是没办法构造出让o(n)过不了的测试数据,因为读入测试数据就需要o(n)的时间。
但这和面试没关系,所以面试官找你要logn还是得给他写。
然后我说排序能过,意思是你过不了一定是你代码有bug,而不是题目精心构造了卡常数的测试数据。

无标题无名氏No.65961906

2025-04-30(三)00:06:48 ID: Gs2SdhS

其实acm的话不少o(n)的题nlogn都放人过的