【파이썬 CheckiO 题 解가】 히스토그램에서 가장 큰 사각형


CheckiO는,이 블로그는 파이썬에서 할을 자신의 생각을 기록하기 위해 주로하여 코딩 능력을 향상 코드 게임, 주소 어려운 도전에 파이썬과 자바 스크립트와 흥미로운 작업 초보자 및 고급 프로그래머를위한 체크 포인트 및 구현 코드에서 문제 다른 위대한 하나님이 코드를 작성에서뿐만 아니라 배운다.

CheckiO 공식 웹 사이트 : https://checkio.org/

내 CheckiO 홈 : https://py.checkio.org/user/TRHX/

열 CheckiO 문제 솔루션 시리즈 : https://itrhx.blog.csdn.net/category_9536424.html

CheckiO 문제 소스에 대한 모든 솔루션 : https://github.com/TRHX/Python-CheckiO-Exercise


제목 설명

에서 직사각형 최대 히스토그램 [] :리스트 주어진 행렬의 최대 영역의 히스토그램을 추구리스트 엘리먼트 히스토그램 구성된 최대 직사각형 영역을 계산 사각형의 모든 높이의 막대 그래프를 나타낸다.
그림 삽입 설명 여기
[링크] : https://py.checkio.org/mission/largest-histogram/

[Enter] 키 : 직사각형 모든 히스토그램에서의 높이

[출력] : 최대 사각형

[가정] : 0 <len (data) <1000

[실시 예] :

largest_histogram([5]) == 5
largest_histogram([5, 3]) == 6
largest_histogram([1, 1, 4, 1]) == 4
largest_histogram([1, 1, 3, 1]) == 4
largest_histogram([2, 1, 4, 5, 1, 3, 3]) == 8

코드 구현

def largest_histogram(histogram):
    i = 0
    max_value = 0
    stack = []
    histogram.append(0)
    while i < len(histogram):
        if len(stack) == 0 or histogram[stack[-1]] <= histogram[i]:
            stack.append(i)
            i += 1
        else:
            now_idx = stack.pop()
            if len(stack) == 0:
                max_value = max(max_value,i * histogram[now_idx])
            else:                    
                max_value = max(max_value,(i- stack[-1] -1) * histogram[now_idx])
    return max_value


if __name__ == "__main__":
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert largest_histogram([5]) == 5, "one is always the biggest"
    assert largest_histogram([5, 3]) == 6, "two are smallest X 2"
    assert largest_histogram([1, 1, 4, 1]) == 4, "vertical"
    assert largest_histogram([1, 1, 3, 1]) == 4, "horizontal"
    assert largest_histogram([2, 1, 4, 5, 1, 3, 3]) == 8, "complex"
    print("Done! Go check it!")

테라스 해답

테라스 해답 NO.1

def largest_histogram(h):
    result = min(h) * len(h)
    for w in range(1, len(h)):
        for i in range(len(h) - w + 1):
            result = max(result, min(h[i:i + w]) * w)
    return result

테라스 해답 NO.2

def largest_histogram(h):
    n = len(h)
    return max((j - i) * min(h[i:j]) for i in range(n) for j in range(i+1, n+1))

테라스 해답 NO.3

def largest_histogram(histogram):
    return max(height * max(len(strip) for strip in ''.join('x' if x >= height else ' ' for x in histogram).split()) for height in set(histogram))

테라스 해답 NO.4

def mesure(hist):
    return min(hist) * len(hist)
    
def sub_histograms(hist):
    for start in range(len(hist)):
        for stop in range(start+1, len(hist)+1):
            yield hist[start:stop]

def largest_histogram(histogram):
    return max(map(mesure, sub_histograms(histogram)))
게시 된 149 개 원래 기사 · 원 찬양 (518) ·은 460,000 + 조회수

추천

출처blog.csdn.net/qq_36759224/article/details/103646867