所以我有这个问题。
您将得到一个非空的一维数组seq形式的景观。我们的目标是找到一个细胞的指数I,它是一个凹坑。如果seqi <= seqi-1和seqi <= seqi+1是一个坑,例如在数组7、6、9、7、8中,指数1和3是坑。如果第一个或最后一个元素小于或等于其唯一的邻居,它们就被认为是一个坑。例如,3、2、4、4、1的最后一个元素是一个凹坑(也是索引1)。注意,pit的定义也包括相等;例如,在3、2、2、2、5、6、6、8中,索引1、2、3和6是凹坑。作为特例,我们还定义了长度数组的唯一单元格也是一个凹坑。
我已经制定了一个解决方案,使用二进制搜索(某种)来实现O(logn)作为最坏的情况。但是我遇到了一个例子,它什么也不返回,或者没有返回。
def find_pit(seq):
first = 0
last = len(seq) - 1
origlast = last
mid = 0
if len(seq) == 1 :
return 0
else:
while first <= last & mid < last :
mid = (first + last) // 2
if seq[mid] <= seq[mid - 1] & seq[mid] <= seq[mid + 1]:
return mid
else:
if seq[mid] > seq[mid - 1]:
last = mid
else:
first = mid
if seq[0] <= seq[1]:
return 0
elif seq[origlast] <= seq[origlast-1]:
return (len(seq) - 1)
print(find_pit([0,1]))
print(find_pit([5, 4, 3, 6, 7]))我该怎么解决这个问题?
发布于 2015-03-16 02:50:04
您需要更改
&(按位“和”)
至
和(合乎逻辑的“和”)
在您的代码中:
def find_pit(seq):
first = 0
last = len(seq) - 1
origlast = last
mid = 0
if len(seq) == 1 :
return 0
else:
#change next line to use logical and
while first <= last and mid < last :
mid = (first + last) // 2
#change next line to use logical and
if seq[mid] <= seq[mid - 1] and seq[mid] <= seq[mid + 1]:
return mid
else:
if seq[mid] > seq[mid - 1]:
last = mid
else:
first = mid
if seq[0] <= seq[1]:
return 0
elif seq[origlast] <= seq[origlast-1]:
return (len(seq) - 1)
print(find_pit([0,1]))
print(find_pit([5, 4, 3, 6, 7]))用上面的测试用例运行这个测试用例,现在将给出结果:第一个列表为0,第二个列表为2。
发布于 2015-03-16 03:23:25
似乎能在给定的情况下找到第一个坑。我调整了调用,允许检查多个函数。
#.... original find_pit left, but not pasted in
import sys
def find_pit2(seq):
left = sys.maxint
maxp = len(seq)
if maxp == 1 :
return 0
else:
for pos, current in enumerate(seq):
try:
right = seq[pos+1]
except IndexError:
#rightmost, count as right neighbor as bigger
right = sys.maxint
#pit - smaller or equal to neighbours
if left >= current and current <= right:
return pos
left = current
li_f = [find_pit, find_pit2]
for f in li_f:
print f.__name__
print(" ",f([0,1]))
print(" ",f([5, 4, 3, 6, 7]))
print(" ",f([7, 6, 9, 7, 8]))
print(" ",f([3, 2, 2, 2, 5, 6, 6, 8]))给予
find_pit
(' ', 0)
(' ', 2)
(' ', None)
(' ', 3)
find_pit2
(' ', 0)
(' ', 2)
(' ', 1)
(' ', 1) https://stackoverflow.com/questions/29068866
复制相似问题