Likou의 질문 브러싱 수업 02강 - 분할 정복 및 역추적 알고리즘

분할정복(예1) 9자리 전화번호의 문자조합

전화번호 문자 조합 숫자 2-9만 포함하는 문자열이 주어지면 그것이 나타낼 수 있는 모든 문자 조합을 반환합니다. 답변은 어떤 순서로든 반환될 수 있습니다. 숫자와 문자의 매핑은 아래와 같습니다(전화 키와 동일). 참고 1은 어떤 문자에도 해당하지 않습니다⺟

• 예 1: 输⼊:digits = "23" 输出: [“ad","ae","af","bd","be","bf","cd","ce","cf" ]

• 예 2: 입력: 숫자 = "" 출력: []

• 예 3: 입력: 숫자 = "2" 출력: ["a","b","c"]

리트코드17

d={2:'abc',3:'def',4:'ghi',
   5:'jkl',6:'mno',7:'pqrs',
   8:'tuv',9:'wxyz'
   }

res=[]
def gene(digits,i,s):
    if len(digits)==len(s):  #
        res.append(s)
        return

    m=d[int(digits[i])]   # 获得对应字母 digits[i]为str类型

    for a in m:
        gene(digits,i+1,s+a)  # 进入下一层  i加1 递归下一个位置 s+a保存当前字母


digits='29'   # str类型
gene(digits,0,'')
print(res)

잘 이해가 안 돼요

 분할 및 정복(예 2)은 pow(x, n)을 구현합니다. 즉, x의 n번째 거듭제곱 함수를 계산합니다.

• 예시 1:

• 입력: 2.00000, 10

• 출력: 1024.00000

• 예시 2:

• 입력: 2.10000, 3

• 출력: 9.26100

• 예시 3:

• 입력: 2.00000, -2

• 출력: 0.25000

• 설명: 2-2 = 1/22 = 1/4 = 0.25

def pow(x,n):
    if n==1:
        return x

    y=pow(x,n//2)
    if n%2==0:
        return y*y
    else:
        return y*y*x

잘 이해가 안 돼요

 역추적(예 3) 여덟 여왕 문제

8×8 체스판에 8개의 퀸을 서로 공격할 수 없도록 배치합니다. 즉, 같은 행, 열 또는 대각선에 두 개의 퀸이 있을 수 없습니다. 배치하는 방법은 몇 가지입니까?

역추적법: 갈등이 있으면 해결하고, 갈등이 없으면 앞으로 나아가고, 돌아갈 길이 없으면 답은 끝이다. 

'''


递归参数:
     n: n皇后
     i: 递归到第几行 0
     l: 记录路径结果 [-1]*n


标记list:  lie=[]
           zXie=[]
           fXie=[]
'''

lie=[]
zXie=[]
fXie=[]
res=[]
def que(n,i,l):
    if n==i:
        res.append(l[:])
        return

    for j in range(n):  # 查找i行存放的位置
        if (j not in lie) and (i+j not in zXie) and (i-j not in fXie):  # j为可以放
            lie.append(j)
            zXie.append(i+j)
            fXie.append(i-j)
            l[i]=j
            que(n,i+1,l)
            lie.remove(j)
            zXie.remove(i+j)
            fXie.remove(i-j)
            l[i]=-1

l=[-1]*4
que(4,0,l)
print(res)

하위 집합을 찾기 위한 역추적(예 4)

정수 배열 nums가 주어졌는데, 배열의 요소는 서로 다릅니다. 이 배열의 가능한 모든 하위 집합을 반환합니다.

솔루션 세트에는 중복된 하위 세트가 포함될 수 없습니다. 솔루션 세트는 어떤 순서로든 반환할 수 있습니다.

예시 1:

입력: 숫자 = [1,2,3]

출력: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

예 2:

입력: 숫자 = [0]

출력: [[],[0]]

'''

i: 下一次开始的位置
n: nums的长度
l:记录结果  []

'''

res=[]  # 最终结果
def gene(nums,i,n,l):
    res.append(l)
    for j in range(i,n):
        gene(nums,j+1,n,l+[nums[j]])

nums=[1,2,3]
n=len(nums)
gene(nums,0,n,[])
print(res)

 역추적(예 5) 대부분의 요소

크기가 n인 배열이 주어지면 해당 배열의 요소 대부분을 찾습니다. 다수의 요소는 배열에서 ⼊ n/2 ⌋ 번 이상 나타나는 요소를 나타냅니다.

배열은 비어 있지 않으며 주어진 배열에는 항상 대부분의 요소가 있다고 가정할 수 있습니다.

예시 1:

입력: [3,2,3]

출력: 3

예 2:

입력: [2,2,1,1,1,2,2]

출력: 2

LeetCode 169. 대부분의 요소

질문을 이해하지 못했습니다

Supongo que te gusta

Origin blog.csdn.net/Albert233333/article/details/132915775
Recomendado
Clasificación