LeetCodeブラシ問題(Python)|275.H-Index II
タイトルリンク
https://leetcode.com/problems/h-index-ii/
心得
274.H−Indexの後続の問題は,配列が秩序化されていると仮定した.前回のブログのやり方に従って、可能なh値ごとに遍歴して判断すると、時間の複雑度はO(n)であり、問題設定の要求O(logn)に合わない.この時間の複雑さの要求を見て、自然に二分法を思いついた.
hの定義に戻る:配列の中で1つの数字Hを見つけて、配列の中で少なくともHの数字がH以上で、残りの数字がH以下である.この配列が秩序配列である場合、この定義はさらに次のようになります.
hが定義に合致する場合、citations[len−h]≧h、すなわち配列中の少なくともH個の数字がH以上である.citations[len−h−1]≦h,すなわち残りの数はH以下である.ここではlen−h−1≧0という前提条件がある.ここでlenは配列サイズです.
さらに,hが定義に合致しない場合,citations[len−h]h:hはもっと大きいはずです.
この式ができてから、h値を判断したら、hが大きくなるべきか小さくなるべきかがわかります.このh値を二分法で見つけることができます.
ACコード
問題を残す
タイトルには次のようなものがあります.
Note: If there are several possible values for h, the maximum one is taken as the h-index.
しかし二分法では,より小さなh値が取得され,プログラムが戻る場合がある.
この問題を避けるなら?それともこの問題は全然現れないのですか?教えてください.
https://leetcode.com/problems/h-index-ii/
心得
274.H−Indexの後続の問題は,配列が秩序化されていると仮定した.前回のブログのやり方に従って、可能なh値ごとに遍歴して判断すると、時間の複雑度はO(n)であり、問題設定の要求O(logn)に合わない.この時間の複雑さの要求を見て、自然に二分法を思いついた.
hの定義に戻る:配列の中で1つの数字Hを見つけて、配列の中で少なくともHの数字がH以上で、残りの数字がH以下である.この配列が秩序配列である場合、この定義はさらに次のようになります.
hが定義に合致する場合、citations[len−h]≧h、すなわち配列中の少なくともH個の数字がH以上である.citations[len−h−1]≦h,すなわち残りの数はH以下である.ここではlen−h−1≧0という前提条件がある.ここでlenは配列サイズです.
さらに,hが定義に合致しない場合,citations[len−h]
この式ができてから、h値を判断したら、hが大きくなるべきか小さくなるべきかがわかります.このh値を二分法で見つけることができます.
ACコード
class Solution(object):
def hIndex(self, citations):
""" :type citations: List[int] :rtype: int """
start, end = 1, len(citations)
while start <= end:
h = int((start+end)/2)
if citations[len(citations)-h] < h: # h
end = h-1
elif len(citations)-h-1>=0 and citations[len(citations)-h-1] > h: # h
start = h+1
else:
return h
return 0
if __name__ == '__main__':
s = Solution()
array = [1,1]
array.sort()
print(s.hIndex(array))
問題を残す
タイトルには次のようなものがあります.
Note: If there are several possible values for h, the maximum one is taken as the h-index.
しかし二分法では,より小さなh値が取得され,プログラムが戻る場合がある.
この問題を避けるなら?それともこの問題は全然現れないのですか?教えてください.