[LeetCode]: 295. 데이터 흐름 의 중위 수

2051 단어
53. 최대 하위 순서 와
질문 설명:
중위 수 는 서열 표 중간의 수 이다.목록 길이 가 짝수 라면, 중위 수 는 중간 두 수의 평균 값 이다.
예컨대
[2, 3, 4] 의 중위 수 는 3 이다.
[2, 3] 의 중위 수 는 (2 + 3) / 2 = 2.5 이다.
다음 두 가지 조작 을 지원 하 는 데이터 구 조 를 설계 합 니 다.
  • void addNum (int num) - 데이터 흐름 에서 하나의 정 수 를 데이터 구조 에 추가 합 니 다.
  • double findMedian () - 현재 모든 요소 의 중위 수 를 되 돌려 줍 니 다.

  • [제목 링크] (https://leetcode-cn.com/problems/find-median-from-data-stream/
    예시 1
    addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2
    생각:
    이 문제 의 가장 중요 한 부분 은 우리 가 데 이 터 를 두 부분 으로 골 고루 나 누 어야 한 다 는 것 이다. 앞부분 의 모든 데 이 터 는 뒷부분 보다 작다. 그러면 우 리 는 시간 복잡 도 O(1) 에 있 을 수 있다.배열 의 중위 수 를 찾 습 니 다. 이 문 제 는 가장 많은 더미 와 최소 더미 로 이 목적 을 달성 하 는 것 을 고려 합 니 다. 데이터 가 두 부분 으로 고 르 게 나 뉘 도록 하기 위해 서 두 더미 의 숫자 차 이 는 1 을 초과 할 수 없습니다. 따라서 우 리 는 데이터 의 총 수량 이 짝수 일 때 새 데 이 터 를 최소 더미 에 삽입 합 니 다. 그렇지 않 으 면 최대 더미 에 삽입 합 니 다.
    그 밖 에 가장 많은 데 이 터 는 최소 더미 의 데이터 보다 작 아야 합 니 다. 데 이 터 를 최소 더미 에 삽입 할 때 먼저 최대 더미 에 삽입 한 다음 에 가장 많은 최대 치 를 꺼 내 최소 더미 에 삽입 하면 최소 더미 의 모든 숫자 가 가장 많은 것 보다 크다 는 것 을 보증 할 수 있 습 니 다. 또한 데이터 분포 가 균일 합 니 다. 코드 는 다음 과 같 습 니 다.
    전체 코드:
    public class MedianFinder {
    
    
        // count         ,         
        private int count = 0;
        private PriorityQueue minHeap;
        private PriorityQueue maxHeap;
        public MedianFinder() {
            minHeap = new PriorityQueue<>();
            maxHeap = new PriorityQueue<>((a,b) -> {return b-a;});
        }
    
        public void addNum(int num) {
            if (count % 2 == 0) {
                maxHeap.offer(num);
                int tmp = maxHeap.poll();
                minHeap.offer(tmp);
            }else {
                minHeap.offer(num);
                int tmp = minHeap.poll();
                maxHeap.offer(tmp);
            }
            count++;
        }
    
        public double findMedian() {
            if(count %2 == 0){
                return new Double((minHeap.peek() + maxHeap.peek())) / 2;
            }else{
                return new Double(minHeap.peek());
            }
        }
    
    }
    
    

    GitHub 링크 추가

    좋은 웹페이지 즐겨찾기