説明] [タイトル
すべての数は、n-1の範囲0にある長さnの配列です。一部のデジタル配列が重複しているが、重複しているどのように多くの番号がわかりません。各桁が数回繰り返されるか分からないのです。重複した数字のいずれかの配列を見つけてください。例えば、もし入力アレイ7 {2,3,1,0,2,5,3}の長さは、第2の繰り返し桁の対応する出力。
[アイデアを問題解決]
方法1:確立ハッシュテーブルの
時間複雑:O(n)の
空間計算量:O(n)の
注文が回ずつ番号が表示されますの数を格納するための配列を開くために、それは繰り返しを特定することは容易です次のように数字は、Pythonのコードが実装されています。
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
cnt = [0 for _ in range(len(numbers))]
for item in numbers:
if cnt[item] == 0:
cnt[item] += 1
else :
duplication[0] = item
return True
return False
方法2:デジタルホーミング
O(N)時間計算
空間の複雑さ:O(1)
配列の長さがnであるので、各デジタルサイズので、各番号すなわち、N-0〜1の間でありますこれがない場合に、アレイ内の位置posが、この数に等しくなければならない、数字は繰り返し数であり、平均POSは同数と図形番号を有しており、この数は位置にされているべきであり、この数は等しくないとPOS場合この番号は数字となっている必要があり、この数は位置と等しくないとき、この数字はその位置に切り替えるべき。次のようにPythonはコードで実装しました:
# -*- coding:utf-8 -*-
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
# write code here
pos = 0
while pos < len(numbers):
if pos != numbers[pos]:
# 当pos不等于这个数字且这个数字本来应该在的位置上有和这个数字相等的数字时,这个数字即为重复的数字
if numbers[pos] == numbers[numbers[pos]]:
duplication[0] = numbers[pos]
return True
# 当pos不等于这个数字且这个数字本来应该在的位置上的数字和这个数字不相等时,把这个数字交换到它应在的位置上
else:
numbers[numbers[pos]], numbers[pos] = numbers[pos], numbers[numbers[pos]]
else:
pos += 1
return False