[英]Improve this O(N) linear search to O(log N) time complexity
我正在尝试解决这个Geeks for Geeks 问题:
找到出现一次的元素
给定一个由 N 个正整数组成的排序数组 A[],其中所有数字恰好出现两次,除了一个只会出现一次的数字。 找出只出现一次的数字。
你的任务:
您不需要读取输入或打印任何内容。 您的任务是完成带有两个参数(数组 A 和整数 N)并返回仅出现一次的数字的函数 search()。预期时间复杂度: O(Log(N))。
预期的辅助空间: O(1)。约束
0 < N <= 10^6
0 <= A[i] <= 10^9
我的做法:
对于给定的
Array:A
&Size:N
Initialize i With 0i=0
# i 是数组遍历中的索引引用
循环从0 to N-1
# While i<N :
从Array :A
选择第i^th
元素Array :A
# select=A[i]
创建一个子数组(next) 不包含select
# next=A[i+1:]
现在将next
(子数组)与select
如果它包含select
的副本/副本
将select
推到一个新的子数组(previous
)#前一个保留访问元素的记录
将i to +1
更新i to +1
并重复此过程
下一个 tym新值在i
被select=A[i+1]
为select=A[i+1]
检查是否在子阵列存在next
&&
如果previous
子数组也没有包含select
#Hopefully 它被遍历到第一个 tym 并且它是唯一的
返回不previous
和next
子数组中的i^th
元素
代码:
# Function to recognize singular element i
def check(list,n):
i=0
select=0
next=0
previous=[]
while(i<n):
select=list[i]
next=list[i+1:]
if select in next:
previous.append(select)
elif select in previous:
pass
else:
return select
i+=1
# Driver Code
def main():
list=[]
n =int(input('Enter Size of array:'))
for a in range(0,n):
x=int(input('Array[{}]='.format(a)))
list.append(x)
i=check(list,n)
print('The No.is :',i)
main()
上面的脚本有效但不是 O(log N)。 我尝试删除额外的变量并将额外的子数组转换为变量以减少时间。
[免责声明] (不是问题的答案,但可能是解决实际问题的另一种方法。)试试这个平台接受的方法。 但在我看来,它是 O(n)...虽然对关于时间复杂性的问题陈述感到困惑 - 它专门要求 O(log N))。 但它接受...
def search(self, A, N):
ans = 0
for x in A:
ans ^= x
return ans
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.