JAVA算法练习题day61
68.寻找两个正序数组的中位数
困难题也要做,对应题解也要掌握。
class Solution(object):def findMedianSortedArrays(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: float"""#这种双指针的思路以及prev,cur的使用更新语句 还是要熟记于心熟用,n,m = len(nums1),len(nums2)mid = (m+n)/2#存指针的值prev=cur=0i=j=0for _ in range(mid+1):prev=curif i >=n:cur = nums2[j]j+=1elif j>=m:cur = nums1[i]i+=1elif nums1[i]<nums2[j]:cur = nums1[i]i+=1else:cur = nums2[j]j+=1if (m+n)%2==0:return (prev+cur)/2.0return cur
class Solution(object):def findMedianSortedArrays(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: float"""#寻找两个正序数组第K大的数(index要-1)def getK(nums1,nums2,k):m = len(nums1)n = len(nums2)index1 = 0index2 = 0while True:#先处理边界情况,index满了;或者k==1if index1 == m:#注意index别写错return nums2[index2+k-1]elif index2 == n:#注意index别写错return nums1[index1+k-1]elif k == 1:return min(nums1[index1],nums2[index2])#这里newindex要处理越界,记得加上偏移量index i newindex1 = min(index1+k//2-1,m-1)newindex2 = min(index2+k//2-1,n-1)A = nums1[newindex1]B = nums2[newindex2]if A<=B:k -= (newindex1-index1+1)index1 = newindex1+1else:k -= (newindex2-index2+1)index2 = newindex2+1total_length = len(nums1)+len(nums2)if total_length % 2 == 0:return (getK(nums1,nums2,total_length//2)+getK(nums1,nums2,total_length//2+1))/2.0else:#第三个参数的意思是 第K大,所以填的是index+1return getK(nums1,nums2,(total_length+1)//2)
