6. 분치사상
두 갈래 나무의 DFS 중 전서, 중서, 후서는 사실상 분치 사상을 이용했다.
148. Sort List
체인 테이블 병합 정렬 사용
class Solution {
public:
    ListNode* sortList(ListNode* head) {
       if (!head || !head->next) return head;
       ListNode preHead = ListNode(INT_MIN);
       preHead.next = head;
       ListNode *preMid = &preHead, *mid = head;
       while (head && head->next) {
           preMid = mid;
           mid = mid -> next;
           head = head -> next -> next;
       }
       
       preMid -> next = NULL;
       return merge(sortList(preHead.next), sortList(mid));
    }
    
    ListNode* merge(ListNode* left, ListNode* right) {
        ListNode preHead = ListNode(INT_MIN);
        ListNode *pt = &preHead;
        while (left && right) {
            if (left->val < right->val) {
                pt -> next = left;
                left = left -> next;
            } else {
                pt -> next = right;
                right = right -> next;
            }
            pt = pt->next;
        }
        
        pt->next = left?left:right;
        return preHead.next;
    }
};
4. Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
서열을 찍은 두 개의 수조 중의 k대 원소를 찾아라.이것은 분치사상이 아니라 이분찾기와 같아야 한다. 왜냐하면 모든 자식 문제에는 단지 하나의 자식 문제만 있기 때문이다.
모든 하위 문제의 k개 또는 m+n-k 요소를 제거하는 것을 주의하십시오.두 개의 수조의 두 원소를 비교하면 큰 수조의 큰 부분은 빼고 작은 수조의 작은 부분은 뺀다.
A[0], A[1], ... , A[pa-1], ... A[m-1]
B[0], B[1], ... , B[pb-1], ... B[n-1]
그중 B[pb-1],...B[n-1]의 길이에 A[0],...A[pa-1]의 길이는 k입니다.A[pa-1] > B[pb-1]의 경우 B[pb-1]만 유지됩니다.B[n-1]와 A[0],...A[pa-1] A[pa-1]
class Solution {
public:
    // common solutin to get the k-th element in sorted array. k belongs to  [1, n]
    double findMedianSortedArrays(vector& nums1, vector& nums2) {
        int m = nums1.size(), n = nums2.size();
        int len = m + n;
        if (len & 1)
            return helper(nums1, nums2, len / 2 + 1);
        else
            return (helper(nums1, nums2, len / 2) + helper(nums1, nums2, len / 2 + 1)) / 2;
    }
    double helper(vector nums1, vector nums2, int k) {
        int m = nums1.size(), n = nums2.size();
        if (m > n) return helper(nums2, nums1, k);
        if (m == 0) return nums2[k - 1];
        if (k == 1) return min(nums1[0], nums2[0]);
        int pa = min(k / 2, m), pb = k - pa;
        if (nums1[pa - 1] < nums2[pb - 1]) {
            nums1.erase(nums1.begin(), nums1.begin() + pa);
            nums2.erase(nums2.begin() + pb, nums2.end());
            return helper(nums1, nums2, k - pa);
        }
        else if (nums2[pb - 1] < nums1[pa - 1]) {
            nums2.erase(nums2.begin(), nums2.begin() + pb);
            nums1.erase(nums1.begin() + pa, nums1.end());
            return helper(nums1, nums2, k - pb);
        }
        else {
            return nums1[pa - 1];
        }
    }
};
    
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.