写作绅士,读作丧尸 X岛揭示板
顺猴者昌 逆猴者亡 首页版规 |用户系统 |移动客户端下载 | 丧尸路标 | | 常用图串及路标 | 请关注 公众号:【矛盾苇草】| 人,是会思考的芦苇
常用串:·豆知识·跑团板聊天室·公告汇总串·X岛路标

No.65945146 - 无标题 - 技术宅


回应模式
No.65945146
名 称
E-mail
标题
颜文字
正文
附加图片
•程序语言、压制投稿、视频制作以及各计算机领域的技术问题
•我觉得还是CSDN靠谱一点
•本版发文间隔为15秒。

无标题 无名氏 2025-04-28(一)08:18:47 ID:1th3CTn [举报] [订阅] [只看PO] No.65945146 [回应] 管理
各位大佬好, 本肥刚刚开始接触力扣, 为什么这道题运行能通过但是提交一直显示超过时间限制啊? 请各位大佬赐教!
我的解法如下, 我的这个解法时间复杂度是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
无标题 无名氏 2025-04-28(一)08:20:36 ID:1th3CTn (PO主) [举报] No.65945158 管理
好像把缩进给搞没了,我再输一次
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
无标题 无名氏 2025-04-28(一)08:20:55 ID:1th3CTn (PO主) [举报] No.65945163 管理
咋还是没缩进(´゚Д゚`)
无标题 无名氏 2025-04-28(一)08:42:53 ID:HsqPnDY [举报] No.65945251 管理
>>No.65945163

strip了应该是,半角空格会被删掉,用别的paste来发代码吧
无标题 无名氏 2025-04-28(一)09:05:38 ID:oComTmr [举报] No.65945362 管理
>>No.65945163
发代码建议整个gist之类的地方放,实在不行截图都比直接发好点
无标题 无名氏 2025-04-28(一)11:13:56 ID:1th3CTn (PO主) [举报] No.65946204 管理
>>No.65945251
感谢提醒,https://paste.org.cn/sramWGtEoJ
无标题 无名氏 2025-04-28(一)11:40:23 ID:NY6IAWL [举报] No.65946376 管理
list2_ptr = total // 2 - list1_mid
这是找中位点吗?奇数整除直接下滑少一位了,是不是改成(total+1) // 2?
我觉得这种算法题直接交给ai好了
无标题 无名氏 2025-04-28(一)12:02:31 ID:i5WQHWG [举报] No.65946554 管理
编程问题建议发在stack overflow, 那边的大佬最多
无标题 无名氏 2025-04-28(一)14:52:06 ID:1th3CTn (PO主) [举报] No.65947741 管理
>>No.65946376
嗯, 一般来说是要加1的, 我这里没加1, 但是在判断列表为奇数的时候选取的是指针的下一位(第67行的判断:right_part_min = min(list1_next_item, list2_next_item))
结果是不会错, 但一般来说加1会更常规一点, 所以还是按(total+1) // 2 来要好
无标题 无名氏 2025-04-28(一)14:53:12 ID:1th3CTn (PO主) [举报] No.65947752 管理
>>No.65946554
好的,我去问问
无标题 无名氏 2025-04-28(一)15:45:49 ID:oComTmr [举报] No.65948120 管理
仔细看了看,原来是这题,这个是个debug地狱,我除了把正确答案贴出来之外帮不了你,当年写这题我调试到红温都没过,最后还是过了一个月重新打开写才过了。

超时了大概率是死循环了,建议把失败的用例放本地一步步调试。

( ゚∀。)
无标题 无名氏 2025-04-28(一)21:23:54 ID:Gs2SdhS [举报] No.65951114 管理
算法题很难出现O(logn)的复杂度,因为输入复杂度是O(n)
我觉得也许你可以试试换个语言
无标题 无名氏 2025-04-28(一)21:48:33 ID:Gs2SdhS [举报] No.65951465 管理
行吧这题假装有复杂度要求,实际排序都能过
无标题 无名氏 2025-04-29(二)05:18:20 ID:1th3CTn (PO主) [举报] No.65953837 管理
>>No.65951465
排序是怎么样过的?
无标题 无名氏 2025-04-29(二)05:20:57 ID:1th3CTn (PO主) [举报] No.65953839 管理
>>No.65948120
没有进死循环, 力扣显示的是运行测试能过但是提交过不了
无标题 无名氏 2025-04-29(二)05:29:37 ID:1th3CTn (PO主) [举报] No.65953848 管理
>>No.65951114
我不太能理解这句话的意思, 但是时间复杂度O(log n)应该是蛮常见的, 这个题的解是对总数较小的列表做二分查找, 所以时间复杂度为O(log(min(m,n))), 如果直接一个一个排序查找的话, 可能达不到时间复杂度要求啊
无标题 无名氏 2025-04-29(二)08:08:07 ID:oComTmr [举报] No.65954113 管理
>>No.65951114
但是这题你用On过了不就相当于自欺欺人吗?这可是hard而且题目明确要求了logn( ゚∀。)
无标题 无名氏 2025-04-29(二)08:10:25 ID:oComTmr [举报] No.65954125 管理
>>No.65953839
运行能成功表示你三个默认用例能pass而已,这题你如果超时只能是死循环了
无标题 无名氏 2025-04-29(二)18:45:33 ID:1th3CTn (PO主) [举报] No.65959165 管理
>>No.65954125
重复试了很多次,没有进死循环啊
无标题 无名氏 2025-04-29(二)19:48:01 ID:oComTmr [举报] No.65959708 管理
>>No.65959165
是特定用例会死循环,你要找到那个会导致死循环的用例,然后本地调试( ゚∀。)

UP主: