연속 서브 시퀀스에 LeetCode 659 분할 어레이

매우 흥미로운 질문, 각 요소에 대해, 우리는 두 가지 선택이있다 :

1. 그것은의 추가에 좋은 직선 구성 이전입니다

2. 새 직선을 열 때 사용

여기에 욕심 전략, 하나는 항상 새로운 오픈 준코가 실패 할 수 있기 때문에도 새롭게 문을 연 바로 성공하지만 하나가 충족 될 때 준코 준코 가입하기 전에, 열리고, 1을 충족하는 첫번째 만날 수있는 경우 성공, 필요가 선택 정책이 위험을 감수하지하는 전략을 선택하는 것이 가능하다.

따라서, 우리는 기록을 똑바로뿐만 아니라 새로운 판단을 바로 열 수 없습니다 수있는 각 요소의 주파수를 알고 끝까지 해시 테이블이 필요합니다.

클래스 해결 {
 공개 :
     BOOL isPossible (벡터 < INT > & nums) { 
        unordered_map도 < INT , INT > 카운트;
        위한 ( INT의 NUM : nums ++) [NUM] 카운트; 
        
        unordered_map도 < INT , INT > 꼬리; // 꼬리가 필요 -> NUM 
         ( INT의 NUM : nums)는 {
             경우 ([NUM] 카운트 == 0 ) 계속을 ;
            - [NUM] 카운트;
            만약(꼬리 [NUM]> 0 ) { // 기존의 시퀀스에 추가 
                - 카운트 [NUM];
                --tails [NUM] == 0 ;
                ++ 꼬리 [NUM + 1 ]; 
            } 다른 { // 새로운 시퀀스를 시작합니다 
                - [NUM] 계산
                경우 (COUNT [NUM + 1 ] && 카운트 [NUM + 2 ]) {
                     --count [NUM + 1 ]; --count [NUM + 2 ];
                    ++ 꼬리 [NUM + 3 ]; 
                } 다른 돌아  거짓 ; 
            } 
        } 
        반환  사실 ; 
    } 
};

O의 시간 복잡도 (N)

 

추천

출처www.cnblogs.com/hankunyan/p/11495248.html