Python程序员面试算法宝典---解题总结: 第4章 数组 4.2 如何查找数组中元素的最大值和最小值

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第4章 数组 4.2 如何查找数组中元素的最大值和最小值

题目:
给定数组a1,a2,a3,..,an,要求找出数组中的最大值和最小值。
假设数组中的值两两各不相同。

分析:
我记得之前有分治算法的题目就是求数组的最大值和最小值的。
最简单的方法就是遍历整个数组用两个变量minValue和maxVale来记录最小值和最大值。
分治算法的思想:
将问题划分成更小的问题,对小问题求解,将各个小问题的求解值汇总,
然后求解出大问题的值。

关键:
1 分治三步骤
1) 划分子问题,2) 递归, 3)合并

2 为了减少递归的次数
在只有两个元素的时候直接比较,而不是通过递归来比较
        # 如果有两个元素就可以比较大小了,节省递归次数
        if begin + 1 == end:
            if data[begin] > data[end]:
                return data[end], data[begin]
            else:
                return data[begin], data[end]

参考:
Python程序员面试算法宝典
'''

class MyArray(object):
    def __init__(self):
        self.min = float('inf')
        self.max = float('-inf')

    def findMinAndMax(self, data, begin, end):
        if not data:
            return None, None
        if begin > end:
            return float('inf'), float('-inf')
        if begin == end:
            return data[begin], data[begin]
        # 如果有两个元素就可以比较大小了,节省递归次数
        if begin + 1 == end:
            if data[begin] > data[end]:
                return data[end], data[begin]
            else:
                return data[begin], data[end]
        # 对左半边递归处理
        size = end - begin
        middle = size / 2 + begin
        leftMin, leftMax = self.findMinAndMax(data, begin, middle)
        # 对右半边递归处理
        rightMin, rightMax = self.findMinAndMax(data, middle + 1, end)
        # 合并处理
        minValue = min(leftMin, rightMin)
        maxValue = max(leftMax, rightMax)
        if minValue < self.min:
            self.min = minValue
        if maxValue > self.max:
            self.max = maxValue
        return minValue, maxValue


def process():
    data = [1, 5, 6, 3, 2, 4]
    array = MyArray()
    array.findMinAndMax(data, 0, len(data) - 1)
    minValue = array.min
    maxValue = array.max
    print "min: {min}, max: {max}".format(
        min=minValue,
        max=maxValue
    )
    data = list(range(1, 7))
    array = MyArray()
    array.findMinAndMax(data, 0, len(data) - 1)
    minValue = array.min
    maxValue = array.max
    print "min: {min}, max: {max}".format(
        min=minValue,
        max=maxValue
    )
    data = list(range(6, 0, -1))
    array = MyArray()
    array.findMinAndMax(data, 0, len(data) - 1)
    minValue = array.min
    maxValue = array.max
    print "min: {min}, max: {max}".format(
        min=minValue,
        max=maxValue
    )


if __name__ == "__main__":
    process()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/92371706