问题
给定一个正整数数组,前半段非递减、后半段非递增,要求从小到大不重复打印数字。给定时间复杂度O(n),空间复杂度O(1)
解题思路
分析:这道题,可以理解为合并两个有序数组,并且合并后的数组中,无相等的元素即可。基于时间复杂度和空间复杂度的要求,用双指针实现,即可达到目标。
”正整数数组,前半段非递减、后半段非递增”。也就是说,前半段从小到大,后半段从大到小。一个不恰当的比喻就是金字塔状。中间大,两边小。因此,开始和结尾各设置一个变量(指针),分别为left和right,指向第一个元素和最后一个元素,然后比较对应位置处的元素对象,并且比较的较小的元素,当前位置邻近的元素不相等,即可输出,下标变化。注意:最后的一个元素输出。
python实现代码
'''
给定一个正整数数组,前半段非递减、后半段非递增,要求从小到大不重复打印数字。给定时间复杂度O(n),空间复杂度O(1)
'''
def printSortArr(numArr):
right = len(numArr)-1
left = 0
while left <= right:
if numArr[left]<numArr[right] and numArr[left] < numArr[left+1]: # 左侧不重复输出
print(numArr[left])
left += 1
elif numArr[left] < numArr[right] and numArr[left] == numArr[left+1]:
left += 1
elif numArr[left] > numArr[right] and numArr[right] < numArr[right-1]: # 右侧不重复输出
print(numArr[right])
right -=1
elif numArr[left] > numArr[right] and numArr[right] == numArr[right-1]:
right -=1
else:
left += 1
print(numArr[right]) # 输出最后一个标记元素
'''
主程序
'''
numArr = [1,1,1,2,3,4,9,10,9,5,4,3,2,2,2]
# numArr = [1,4,3,2,2]
printSortArr(numArr)
程序测试输出结果: