📜  打印排序数组中存在的所有唯一元素(1)

📅  最后修改于: 2023-12-03 15:39:41.492000             🧑  作者: Mango

打印排序数组中存在的所有唯一元素

当给定一个已排序的数组时,我们有多种方法来打印所有唯一元素。这里, 我们将讨论三种不同的方法:使用暴力循环,使用哈希表和使用双指针。

方法1:暴力循环

第一种方法是使用暴力循环,我们可以遍历数组并检查每个元素是否与前一个元素不同。如果不同,则将其打印出来。

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$为数组的长度。

方法2:使用哈希表

第二种方法是使用一个哈希表来存储每个元素出现的次数。然后我们可以遍历哈希表并打印所有出现次数为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$为数组的长度。需要额外的空间来存储哈希表。

方法3:使用双指针

第三种方法是使用双指针。我们使用两个指针,一个指向数组中的唯一元素,另一个指向数组中所有元素中的下一个元素。如果两个指针指向的元素相同,则移动第二个指针直到遇到一个不同的元素。然后,第一个指针将被指向到这个不同的元素处,并且重复上述过程,直到遍历完整个数组。

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$为数组的长度。这种方法并不需要额外的空间来存储任何数据结构。