第一次在leetcode上做hard级别的题目
来源:互联网 发布:c语言无线循环 编辑:程序博客网 时间:2024/05/22 07:56
今天第一次在LeetCode做hard级别的题目:Median of Two Sorted Arrays.
题目大意是这样的:给两个排好序的数组,让找出它们合成一个数组的时候的中位数。数组的长度分别为m,n,要求时间复杂度为O(log(m+n))。本来拿到这个题目,一眼看过去感觉有点熟悉,有点归并排序的影子。如果真是归并排序的话,这已经是最后一步。但是题目要求的时间复杂度是O(log(m+n)),而用归并的话基本上是m+n级别的。做出来不难,难的是控制这个时间复杂度。
折腾了半天,吭吭哧哧弄出一个solution,总体思路是找到较短的那个数组,找出它的中位数,然后根据该数可以每次删去较短数组长度的那么多的项,具体可以见下面代码。时间复杂度不好估计,但是应该<O(logm+logn),基本上可以认为是达到要求了吧。
我的代码:
#!/usr/bin/python#coding=utf8"""# Author: qwqian# Created Time : 2017-12-17 13:22:31# File Name: medianOfTwoSortedArray.py# Description:"""class Solution(object): def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ m = len(nums1) n = len(nums2) if n > m: nums1, nums2 = nums2, nums1 m, n = n, m if n == 0: if m == 0: return None elif m % 2 == 1: return nums1[m/2]/1.0 else: return (nums1[m/2-1] + nums1[m/2])/2.0 if n == 1: if m % 2 == 0: if nums2[0] < nums1[m/2 - 1]: return nums1[m/2 -1] elif nums2[0] < nums1[m/2]: return nums2[0] else: return nums1[m/2] else: if m == 1: return (nums1[0] + nums2[0]) / 2.0 else: if nums2[0] < nums1[m/2 - 1]: return (nums1[m/2 -1] + nums1[m/2]) / 2.0 elif nums2[0] < nums1[m/2 + 1]: return (nums1[m/2] + nums2[0]) / 2.0 else: return (nums1[m/2] + nums1[m/2 + 1]) / 2.0 a = nums2[n/2] b = nums1[n/2] c = nums1[m - n/2 - 1] d = nums2[n/2-1] if m == n: b,c = c,b if a < b: nums2 = nums2[n/2 : n] nums1 = nums1[0 : m - n/2] elif a > c: if d < b: if n % 2 == 0: nums2 = [] else: nums2 = [a] else: nums2 = nums2[0 : n - n/2] nums1 = nums1[n/2 : m] else: if d < b: nums2 = nums2[n/2 : n] nums1 = nums1[0 : m - n/2] else: nums1 = nums1[n/2 : m - n/2] return self.findMedianSortedArrays(nums1, nums2)def main(): nums1 = [1,2,3] nums2 = [4,5,6] solution = Solution() result = solution.findMedianSortedArrays(nums1, nums2) print resultif __name__ == "__main__": main()
我刷题之后习惯会看看前面高手们的解题方法,有助于打开思路提高自己,然后我看到了这个代码(排在第二):
class Solution(object): def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ all_nums = nums1 + nums2 len_all = len(all_nums) all_nums.sort() if len_all == 0: return None elif len_all == 1: return all_nums[0] elif len_all == 2: return ((all_nums[0] + all_nums[1]) / 2.0) if len_all % 2 == 0: median = (all_nums[(len(all_nums) / 2)] + all_nums[(len(all_nums) / 2) - 1]) / 2.0 else: median = all_nums[(len(all_nums) / 2)] return median
人用了一个Python自带的sort函数。。。。。。内心有种日了狗的感觉。
阅读全文
0 0
- 第一次在leetcode上做hard级别的题目
- 第一次leetcode题目
- 在公司做的第一次技术分享
- leetcode第二遍不需要做的题目
- LeetCode题目85.Maximal Rectangle(Hard)
- 第一次在CSDN的Blog上~
- 第一次在自己的Blog上闲逛...
- PyCharm在MAC上的第一次使用
- Leetcode 2 第一次做 Python
- LeetCode上的几道数据库题目
- leetcode上数据库的题目(1)
- 第一次做leetcode中Difficulty为easy的题-292
- 第一次在csdn上
- 通过注解在方法级别上使用拦截器做登录权限校验
- 第一次做的
- 第一次做的
- 第一次做的爬虫
- 我在第一次做项目时遇到的那些事儿
- 静态顺序表的实现
- linux 进程间通讯方式
- day1
- 2017-11-21 background-position的应用
- ORACLE EBS常用表及查询语句(最终整理版)
- 第一次在leetcode上做hard级别的题目
- 前端面试题目总结
- list
- linux下卸载apache方法小结
- linux常用命令小结
- 4.Median of Two Sorted Arrays
- IAR Embedded Workbench for ARM 8.20安装破解图文教程(附下载)
- 树- 树与对应二叉树之间的转化
- React之Fiber算法