【题目】
给定一个字符类型数组chas,判断chas中是否所有的字符都只出现过一次。
【基本思路】
一.时间复杂度为O(N)的算法。
使用哈希表,记录每个字符出现的频数,如果发现字符的频数不为1,直接返回False。
二.时间复杂度为O(NlogN),空间复杂度为O(1)的算法。
1.先将数组排序,再判断当前字符是否等于前一个字符即可。
2.关键使用什么样的排序算法,满足复杂度要求的算法只有非递归版的堆排序。
下面是使用python3.5实现的代码
#判断字符数组中是否所有的字符只出现了一次
#时间复杂度O(N)的算法
def isUnique1(arr):
if arr == None or len(arr) == 0:
return True
map = {}
for i in range(len(arr)):
if arr[i] in map:
return False
map[arr[i]] = None
return True
#额外空间复杂度O(1)的算法
def isUnique2(arr):
def heapSort(arr):
n = len(arr)
for i in range((n-2)//2, -1, -1):
precDown(arr, i, n)
for i in range(n-1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
precDown(arr, 0, i)
return arr
def precDown(arr, i, n):
child = 2 * i + 1
tmp = arr[i]
while child < n:
if child < n-1 and arr[child] < arr[child+1]:
child += 1
if tmp < arr[child]:
arr[i] = arr[child]
i = child
else:
break
child = 2 * i + 1
arr[i] = tmp
if arr == None or len(arr) == 0:
return False
print(heapSort([9,8,7,6,5,4,3,12,45,67]))
heapSort(arr)
for i in range(1, len(arr)):
if arr[i] == arr[i-1]:
return False
return True