📅  最后修改于: 2023-12-03 15:39:41.492000             🧑  作者: Mango
当给定一个已排序的数组时,我们有多种方法来打印所有唯一元素。这里, 我们将讨论三种不同的方法:使用暴力循环,使用哈希表和使用双指针。
第一种方法是使用暴力循环,我们可以遍历数组并检查每个元素是否与前一个元素不同。如果不同,则将其打印出来。
def print_unique_elems(arr):
# 遍历数组,检查每个元素是否与前一个元素不同
for i in range(len(arr)):
# 如果是第一个元素或者与前一个元素不同
if i == 0 or arr[i] != arr[i-1]:
print(arr[i])
时间复杂度为$O(n)$,其中$n$为数组的长度。
第二种方法是使用一个哈希表来存储每个元素出现的次数。然后我们可以遍历哈希表并打印所有出现次数为1的元素。
from collections import defaultdict
def print_unique_elems(arr):
# 使用哈希表存储每个元素出现的次数
count_dict = defaultdict(int)
for elem in arr:
count_dict[elem] += 1
# 遍历哈希表,并打印所有出现次数为1的元素
for elem, count in count_dict.items():
if count == 1:
print(elem)
时间复杂度为$O(n)$,其中$n$为数组的长度。需要额外的空间来存储哈希表。
第三种方法是使用双指针。我们使用两个指针,一个指向数组中的唯一元素,另一个指向数组中所有元素中的下一个元素。如果两个指针指向的元素相同,则移动第二个指针直到遇到一个不同的元素。然后,第一个指针将被指向到这个不同的元素处,并且重复上述过程,直到遍历完整个数组。
def print_unique_elems(arr):
# 初始化两个指针i和j,i指向第一个唯一元素,j指向i的下一个元素
i = 0
j = 1
# 遍历整个数组
while j < len(arr):
# 如果i和j指向的元素相同,则移动j指针
if arr[i] == arr[j]:
j += 1
# 如果i和j指向的元素不同,则移动i指针到不同的元素处
else:
print(arr[i])
i = j
j += 1
# 打印最后一个唯一元素
if i == len(arr) - 1:
print(arr[i])
时间复杂度为$O(n)$,其中$n$为数组的长度。这种方法并不需要额外的空间来存储任何数据结构。