LeetCode 经典】MedianSortedArrays

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 经典】MedianSortedArrays相关的知识,希望对你有一定的参考价值。

参考技术A 在两个排序数组中寻找中位数。这个题目本质上二分查找 binarySearch 的变种。需要采用跟二分法类似的思路:先确定一个 median,然后根据当前的状态,舍弃一半,在剩下的一半中继续寻找。

这个问题是不能回避的。对于一个排序数组,我们求 median 的时候,其实会根据数组的元素个数分类讨论:如果总数是奇数,就取数组的最中间那个元素,对应的 index = (n + 1) / 2 ,注意,这里其实有一个小细节,即,这里有一个隐含的类型转换:我们把 m.5 转换成了 m 。比如,如果 n = 10,那么得出的 index 应该是 5.5,然后转换成 int 之后,就是 index = 5 。如果总数是偶数,那么就取中间两个元素求平均数,也就是: index1 = n / 2; index2 = index1 + 1; 。

因此,把问题扩展到 median of two sorted array 的时候,我们依然不能回避奇偶性的问题。

在排序数组里面找元素,一般都逃不开二分查找。这相当于充分利用了数组的排序特性。但是,对于两个数组,其实直接二分查找让我们无从下手,因为两个数组之间并没有明确的关系。所以,我们的二分查找只能针对其中一个数组 A,然后看看另一个数组 B 与数组 A 之间有没有什么关系可以找到。
联系到,我们想找数组的中位数。中位数的含义,其实就是找到一个数字,然后让集合中恰好有一半的元素比中位数小,恰好有一半的元素比中位数大。那么把问题拓展到两个数组中之后,我们需要做类似的事情:把两个数组形成的一个大的集合分成两半,一半比中位数小,一半比中位数大。比如,我们通过二分查找,找到了 A 中的下标为 i 的元素,那么,他意味着,A 中有 i 个元素比他小。也就是说,A 对于“小的一半”会贡献 i 个元素。因为我们可以知道,两个数组一共有多少个元素,即 count = len1 + len2 ,那么我们就能知道,“小的一半”一共有多少个元素,即 leftCount = count / 2 ,进而我们就能得出 B 中应该有多少个元素参与到“小的一半”。

动态规划_leetcode279(经典栈板)

#coding=utf-8
#点评:
#递归思想加层次遍历,很经典的解题模板思想 20181220



class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""

pair = (n,0)
queue = []
queue.append(pair)

while queue:
curPair = queue.pop(0)
num = curPair[0]
step = curPair[1]

if num == 0:
return step

for i in range(1,num+1):
if num - i *i >= 0:
nextPair = (num-i*i,step+1)
queue.append(nextPair)
else:
break

class Solution2(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
pair = (n, 0)
queue = []
queue.append(pair)

#matrix = [[0 for i in range(3)] for i in range(3)]
visit = [0 for i in range(n+1)]
visit[n] = 1

while queue:
curPair = queue.pop(0)
num = curPair[0]
step = curPair[1]

if num == 0:
return step


for i in range(1, num + 1):
nextNum = num - i*i
if nextNum >= 0:
if visit[nextNum] == 0:
nextPair = (nextNum, step + 1)
queue.append(nextPair)
visit[nextNum] = 1
else:
break


class Solution3(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
pair = (n, 0)
queue = []
queue.append(pair)

#matrix = [[0 for i in range(3)] for i in range(3)]
visit = [0 for i in range(n+1)]
visit[n] = 1

while queue:
curPair = queue.pop(0)
num = curPair[0]
step = curPair[1]

if num == 0:
return step


for i in range(1, num + 1):
nextNum = num - i*i
if nextNum >= 0:
if visit[nextNum] == 0:

if nextNum == 0:
return step+1

nextPair = (nextNum, step + 1)
queue.append(nextPair)
visit[nextNum] = 1
else:
break


s = Solution2()

print s.numSquares(13)

以上是关于LeetCode 经典】MedianSortedArrays的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode经典题型总结

LeetCode-面试算法经典-Java实现066-Plus One(加一)

LeetCode-面试算法经典-Java实现120-Triangle(三角形)

动态规划_leetcode279(经典栈板)

一文通数据结构与算法之——贪心算法+常见题型与解题策略+Leetcode经典题

LeetCode-面试算法经典-Java实现101-Symmetric Tree(对称树)