[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]に一度しか現れず、配列には現れないため、最終的な異或結果はこの欠落した数字である.
例1:入力:[3,0,1]出力:2例2:
入力:[9,6,4,2,3,5,7,0,1]出力:8説明:あなたのアルゴリズムは線形時間の複雑さを持つべきです.追加の定数空間だけで実現できますか?
考え方:
他の人の考え:
#! /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