Leetcode- 재귀 분할 및 정복 &

50 펑 (X, N)  https://leetcode-cn.com/problems/powx-n/

달성  POW ( XN )  즉, X의 n 번째 전력의 함수.

설명 :

-100.0 <  X  <100.0

N은  수치 범위 [-231 231--1]은 32 비트 정수이다.

해결 방법 :

직접 전송 라이브러리 함수,하지만 당연히 인터뷰한다.

폭력, 직접 기록 사이클 곱셈, O (N).

파티션 ** Y = X (N / 2). 두 부분 측이 계산 될 수있는 N 짝수 입술 = Y * (Y)이다. N이 홀수, 입술의 Y = X *의 *의 예이다. 이 계산에 X 1 또는 X ** ** 0을 갖는다. O의 시간 복잡도 (logN).

재귀

솔루션 클래스 : 
    DEF의 MYPOW (자체, X : 부동, N- : INT) ->의 float : 
        IF N-되지 않음 : 
            리턴 1. 
        IF N- <0 : 
            리턴 1 / self.myPow (X, -n). 
        N- % 2 IF : 
            X를 반환 * self.myPow (X는 N-1 )의 # n이 홀수이고, n-1의 전원 수행하여 
        리턴 self.myPow를 (X *는 X가 N / 2) # n을 짝수 인

  

반복적 인 구현은, 최소 계산 된 파티션 승수 X이다. 예를 들어, X ** (7) = X * X ** (6) = (X) * (X ** 2) ** (3) = (X) * (X ** 2) * ((X ** 2) ** 2) ** 1

클래스 솔루션 : 
    DEF의 MYPOW (자체, X : 부동, N : INT는) -> 부동 소수점은 
        하지 N 경우 : 
            리턴 1 
        , n은 <0 경우 : 적은 다음 0 이상이 N로 변환 #의 n은,보다 크다 0 년대 X는 1이된다 / X와 
            X = X / 1 
            N - N = 
            
        RES = 1 
        그동안 N- : 파티션 1은 전력의 최소 단위이고 
            n은 1 경우 # n을 여분의 X에 의해 먼저 홀수 
                RES의 =의 X * 
            * X = X 배율에서, x는 대략 2 × **된다 # 
            N -. >> 1 = # n 형 층 (N- / 2) 
        복귀를 RES

  

169이 모드를 추구   https://leetcode-cn.com/problems/majority-element/

크기 감안할 때  n 개의  배열, 그들 모두 수를 찾을 수 있습니다. 모드 횟수가 어레이에 나타나는보다 큰  ⌊ n/2 ⌋ 요소.

당신은 배열이 비어 있지 않은 것으로 가정 할 수 있으며, 회중의 지정된 배열 번호는 항상있다.

해결 방법 :

폭력 개의 중첩 루프는 내부에 하나 개의 어레이에 대한 모든 X, X 카운트 열거. O (N 2 )

직접 주문 후 중간 요소가 확실히 모드입니다 걸릴. O (NlogN)

급 솔루션 : 
    DEF majorityElement (자기, nums리스트 [INT]) -> INT : 
        nums.sort () 
        N = LEN (nums) 
        복귀 nums [INT ((N-1) / 2)]

  

해시 맵의 요소 수를 유지하고, 마지막으로 계산 가장 큰 요소 봐 내부지도로 이동하여, 한 번 통과. O (N)

클래스 솔루션 : 
    DEF majorityElement (자기의 nums : 목록 [INT]) -> INT : 
        COUNT = DICT () 
        다음 nums의 X에 대한 
            COUNT에 X 경우 : 
                . COUNT [X] + = 1 
            그렇지 않으면 : 
                . [X] COUNT = 1 
MAX_COUNT 0 = 키위한은 ()의 값을 count.items : 값> MAX_COUNT 경우 : MAX_COUNT 값 =에 RES = 키 바로 리턴 RES 번호 사전 또는 기능을 얻을 광고는 (카운트 키 = count.get을 최대 돌아올 수 )

  

나누고 모든 서브 문제 길이 1의 배열 될 때까지 재귀 적 해법을 정복. 송신 서브 어레이는 추가 시간과 공간을 필요로하므로 포인터 우리 주위 실제로 단지 하위 전송 간격 첨자 주위 그 대응 높고 낮은 영역을 나타내고 있기 때문이다.

  고유 번호의 배열의 길이는 분명히 모드, 그것은 직접 반환 할 수 있습니다.

  1보다 큰 섹션의 후면의 길이, 값을 합하여 서브 인터벌 해결되어야합니다. 그들은 모두 같은 번호 인 경우에, 명확하게이 기간의 모드는 같은 값의 간격입니다. 그렇지 않으면, 당신은 두 가지 모드 비교할 필요 의 전체 범위 의 간격을 결정하는 모드에서 발생 횟수를.

  원래의 질문에 대한 답이 모드 인덱스는 0과 N 서브 문제 사이이다.

시간 복잡도는 O (NlogN)

솔루션 클래스 : 
    DEF majorityElement (자기의 nums : 목록 [INT]) -> INT : 
        리턴 self.helper합니다 (nums, 0, 렌합니다 (nums) -1) 
    
    DEF 도우미 (자기의 nums, 저, 고) 
        = 낮은 IF = 높은 # 1은 서브 어레이의 길이, 즉, 모든 고유 한 소자의 수는 
            nums에 반품 [낮음] 
        
        # 서브 어레이 길이가 약 모드 반복적 어레이 찾기 위해 1보다 큰 
        중간 = 로우 + (하이 - 로우 ) // 2 
        왼쪽 = self.helper합니다 (nums, 낮음, MID) 
        오른쪽 = self.helper합니다 (nums, MID + 1, 높음). 
        
        == 좌우 경우 : 모드가 대략 동일한 경우, 왼쪽과 오른쪽 두 모드 사이의 관계를 분석 중 # 그것은 소수의 전체 수에 대해해야합니다 
            왼쪽 반환   
        
        하지 않으면 #을, 큰 하나가 대중의 전체 수를 전체 수를 
        left_count, right_count = 0, 0 
        범위의 난에 대한 (저, 고 + 1) : 
            IF nums [I] = = 왼쪽 :
                left_count + = 1
            ELIF의 nums [I] == 오른쪽 : 
                right_count + = 1 명 
        
        복귀 경우 left_count> right_count 다른 좌우  

  

 

추천

출처www.cnblogs.com/chaojunwang-ml/p/11357165.html