如何从已排序数组中提取唯一元素并获取结果数组长度?
提取已排序数组中的唯一元素并获取长度
嘿,针对你这个已排序数组提取唯一元素的需求,我给你分享两种实用的解法,适配不同的场景:
方法一:利用集合(Set)快速实现
如果你的数据量不大,或者更看重代码简洁性,直接用Python的集合特性就能搞定——集合天然会自动去重,唯一需要注意的是集合会打乱元素顺序,所以我们再给它排个序(刚好原数组本身就是有序的,排序后结果完全符合预期):
# 定义你的已排序数组 original_arr = (1, 1, 2, 3, 3, 4) # 去重并恢复有序 unique_arr = tuple(sorted(set(original_arr))) # 获取长度 unique_length = len(unique_arr) print(unique_arr) # 输出:(1, 2, 3, 4) print(unique_length) # 输出:4
这种写法非常简洁,几行代码就能完成需求,唯一的小缺点是如果数组特别大,额外的排序操作会带来一点性能开销。
方法二:双指针法(针对已排序数组的高效解法)
因为你的数组已经是排序好的,重复元素必然是相邻的,这时候用双指针法可以做到O(n)的时间复杂度,而且不需要额外的排序操作,性能更优:
def extract_unique(arr): if not arr: return (), 0 # 元组不可变,先转为列表操作 arr_list = list(arr) slow_ptr = 0 # 快指针遍历整个数组 for fast_ptr in range(1, len(arr_list)): # 当找到和慢指针位置不同的元素时,移动慢指针并更新元素 if arr_list[fast_ptr] != arr_list[slow_ptr]: slow_ptr += 1 arr_list[slow_ptr] = arr_list[fast_ptr] # 截取到慢指针位置的前半部分就是去重后的数组 unique_result = tuple(arr_list[:slow_ptr + 1]) return unique_result, len(unique_result) # 调用函数 original_arr = (1, 1, 2, 3, 3, 4) unique_arr, unique_length = extract_unique(original_arr) print(unique_arr) # 输出:(1, 2, 3, 4) print(unique_length) # 输出:4
这个方法的核心是用慢指针标记当前唯一元素的位置,快指针去寻找下一个不同的元素,找到后就把它放到慢指针的下一个位置,最后截取有效部分即可,完全利用了已排序数组的特性,效率拉满。
内容的提问来源于stack exchange,提问作者vamsi
相关产品推荐
相关产品推荐

