【发布时间】:2013-02-15 09:48:32
【问题描述】:
我想知道是否有一种方法可以在不使用 Python 中的 min/max 函数的情况下找到列表的 min 和 max。所以我用递归写了一个小代码。我的逻辑非常幼稚:我制作了两个堆栈(min_stack 和 max_stack),它们在每次递归调用期间跟踪最小值和最大值。我有两个问题:
- 谁能帮我估计一下我的代码的复杂性?
- 有没有更好的方法来做到这一点?使用 mergesort/quicksort 对列表进行排序并选择第一个和最后一个元素会带来更好的性能吗?
这是我在 Python 中的尝试:
minimum = []
maximum = []
# Defining Stack Class
class Stack:
def __init__(self) :
self.items = []
def push(self, item) :
self.items.append(item)
def pop(self) :
return self.items.pop()
def access(self, index):
return self.items[index]
def isEmpty(self) :
return (self.items == [])
def length(self):
return len(self.items)
def minmax(input_list):
# make two stacks, one for min and one for max
min_stack = Stack()
max_stack = Stack()
# comparing the first two elements of the list and putting them in appropriate stack
if input_list[0]<input_list[1]:
min_stack.push(input_list[0])
max_stack.push(input_list[1])
else:
max_stack.push(input_list[0])
min_stack.push(input_list[1])
# Pushing remaining elements of the list into appropriate stacks.
for i in range(2, len(input_list)):
if input_list[i] < min_stack.access(-1):
min_stack.push(input_list[i])
else:
max_stack.push(input_list[i])
# to find minimum
minlist = []
while min_stack.length() > 0:
minlist.append(min_stack.pop())
# to find maximum
maxlist = []
while max_stack.length() > 0:
maxlist.append(max_stack.pop())
if len(minlist) > 1:
minmax(minlist)
else:
minimum.append(minlist)
if len(maxlist) > 1:
minmax(maxlist)
else:
maximum.append(maxlist)
def main():
input_list = [2, 0, 2, 7, 5, -1, -2]
print 'Input List is: ', input_list
minmax(input_list)
print 'Global Minimum is: ', minimum[0]
print 'Global Maximum is: ', maximum[len(maximum)-1]
if __name__ == "__main__":
main()
【问题讨论】:
-
哇...这看起来真的太复杂了...
-
我认为使用 sorted 并采用 0 和 -1 索引会更快......并且更具可读性
a = sorted(my_list);min,max=a[0],a[-1];如果我是一名面试官并问了这个问题......递给我的候选人在你所拥有的不会得到这份工作...... -
@mgilson:是的......它很复杂,因为我被要求使用 Stacks 作为一种锻炼方式来实现它。
-
啊,如果你被明确要求使用堆栈,那么也许......(虽然我不确定为什么有人会想要......)
-
@JoranBeasley:我不确定排序是否是最好的方法。但感谢您的评论。