[LeetCode][Python]268. 欠落した数値

1759 ワード

[LeetCode][Python]268. 欠落した数値は0,1,2,...,nの中のn個の数のシーケンス、0を探し出します..nにはシーケンスに現れる数はありません.
例1:入力:[3,0,1]出力:2例2:
入力:[9,6,4,2,3,5,7,0,1]出力:8説明:あなたのアルゴリズムは線形時間の複雑さを持つべきです.追加の定数空間だけで実現できますか?
考え方:
  • 0が0からnのシーケンスである場合、rangeを使用して0からnを含むシーケンスを生成することができ、2つのシーケンスの減算は欠落の数であるべきである.
  • 配列ソート、0は配列のトップに現れず、nnは配列の末尾に現れなかった.この2つの特殊な状況が満たされていない場合、欠落した数字は必ず0とnnの間にある(両者を含まない).このとき,この配列を線形時間で走査することができ,ある数がその前の数より1を超えると,この2つの数の間の数は欠落した数となる.

  • 他の人の考え:
  • ハッシュ・テーブル:各数が配列に現れるかどうかを直接クエリーして、欠落した数を見つけることができます.ハッシュ・テーブルを使用すると、クエリー・オペレーションのたびに定数時間がかかります.
  • ビット演算:配列にn個の数があり、欠落した数は[0..n]にある.したがって、[0..n]の異種または値を取得してから、結果を配列内の各数に対して異種または演算することができます.欠落していない数は[0..n]と配列に1回ずつ現れるため,異或後に0が得られる.欠落した数字は[0..n]に一度しか現れず、配列には現れないため、最終的な異或結果はこの欠落した数字である.
  • #! /usr/bin/env python
    #coding=utf-8
    class Solution(object):
        def missingNumber(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            all_number_lists = list(range(len(nums) + 1))
            return list(set(all_number_lists) - set(nums))[0]
    
        def missingNumber2(self, nums):
            nums.sort()
            if nums[-1] != len(nums):
                return len(nums)
            elif nums[0] != 0:
                return 0
            for i in range(1, len(nums)):
                expected_num = nums[i-1] + 1
                if nums[i] != expected_num:
                    return expected_num
    
        def missingNumber3(self, nums):
            num_set = set(nums)
            n = len(nums) + 1
            for number in range(n):
                if number not in num_set:
                    return number
    
        def missingNumber4(self, nums):
            missing = len(nums)
            for i, num in enumerate(nums):
                missing ^= i^num
            return missing