>  기사  >  백엔드 개발  >  python 알고리즘 - 조건을 충족하는 두 개의 숫자를 빠르게 찾습니다.

python 알고리즘 - 조건을 충족하는 두 개의 숫자를 빠르게 찾습니다.

高洛峰
高洛峰원래의
2016-10-18 10:38:232160검색

질문의 전제는 이런 숫자가 2개가 있어야 한다는 것입니다

답은 하나도 적지 않겠습니다... 생각나지 않으실 겁니다.

첫 번째 제가 생각한 건 2번 솔루션 끝에 있는 해시 테이블이었는데요

(실제로는 타겟만큼 큰 배열을 만들어볼까 생각도 했습니다. 존재한다면 인덱스를 쓰되 찾고 싶으면 찾으면 됩니다. 다 2차원 배열이 필요한데 나중에 타겟이 너무 크면 공간낭비가 되지 않을까요... 그래서 Dict로 바꿨습니다)

나중에 보니 질문은 두 개의 숫자만 필요합니다. - -

확장 질문이 더 재미있습니다.

3개 찾기 어렵지는 않겠지만 다른 건 잘 모르겠어서 추가하고 싶습니다. ...

1. 2차원 배열

def find_pair(A, target):
    B = [[] for i in range(target + 1)]
    for i in range(0, len(A)):
        if A[i] <= target:
            B[A[i]].append(i)
    for i in range(0, target / 2 + 1):
        if len(B[i]) != 0 and len(B[target - i]) != 0:
            print(i, B[i], target-i, B[target-i])
  
if __name__ == "__main__":
    A = [0, 1, 1, 2, 11, 8, 3, 4, 5, 6, 7, 8, 9, 10]
    find_pair(A, 9)

2. 사전

def find_pair(A, target):
    B = {}
    for i in range(0, len(A)):
        if A[i] <= target:
            if not B.has_key(A[i]):
                B[A[i]] = [i]
            else:
                B[A[i]].append(i)
    for i in range(0, target / 2 + 1):
        if B.has_key(i) and B.has_key(target-i):
            print(i, B[i], target-i, B[target-i])
  
if __name__ == "__main__":
    A = [0, 1, 1, 2, 11, 8, 3, 4, 5, 6, 7, 8, 9, 10]
    find_pair(A, 9)

3. 책에 나온 인덱스를 돌려준다는 뜻이 뭔지 아세요... 게을러서 내장된 것만 사용하는데...

def find_pair(A, target):
    A.sort()
    i, j = 0, len(A) - 1
    while i < j:
        s = A[i] + A[j]
        if s == target:
            print(i, A[i], j, A[j])
            i += 1
            j -= 1
        elif s < target:
            i += 1
        else:
            j -= 1
  
if __name__ == "__main__":
    A = [0, 1, 1, 2, 11, 8, 3, 4, 5, 6, 7, 8, 9, 10]
    find_pair(A, 9)


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.