कठिन 0 हल किए गए 0% स्वीकृति

Count Inversions

Count the out-of-order pairs in a list.

आप क्या सीखेंगे

  • मर्ज करते समय उलटे क्रम वाले जोड़े गिनना
  • मर्ज सॉर्ट में गिनती जोड़ना
  • O(n²) से O(n log n) पर जाना

समस्या

An inversion is a pair of positions i < j with numbers[i] > numbers[j]. Count all inversions. Lists can be long, so a merge-sort based O(n log n) count is needed.

Implement count_inversions(numbers).

Input

numbers: The list of integers.

Output

Return the number of inversions.

सीमाएँ

0 ≤ length ≤ 200,000

उदाहरण

उदाहरण 1
इनपुट:
numbers = [2, 4, 1, 3, 5]

अपेक्षित आउटपुट:
expected = 3
इनपुट:
std::vector<long long> numbers = {2, 4, 1, 3, 5};

अपेक्षित आउटपुट:
long long expected = 3;
इनपुट:
long[] numbers = new long[] {2, 4, 1, 3, 5};

अपेक्षित आउटपुट:
long expected = 3;

व्याख्या

Out-of-order pairs: (2,1), (4,1), (4,3): 3 inversions.

उदाहरण 2
इनपुट:
numbers = [1, 2, 3]

अपेक्षित आउटपुट:
expected = 0
इनपुट:
std::vector<long long> numbers = {1, 2, 3};

अपेक्षित आउटपुट:
long long expected = 0;
इनपुट:
long[] numbers = new long[] {1, 2, 3};

अपेक्षित आउटपुट:
long expected = 0;

व्याख्या

Already sorted: 0 inversions.

कैसे हल करें

पहले खुद कोशिश करें, फिर एक-एक करके संकेत खोलें।

संकेत 1

जब merge करते समय left-side का number right-side के number से बड़ा रह जाए, तब inversion count होती है.

संकेत 2

List को recursively split करें और sorted halves को merge करते समय cross-pairs count करें.

संकेत 3

Duplicates का ध्यान रखें: equal values inversions नहीं होतीं, इसलिए comparison direction important है.

अपेक्षित जटिलता

समय O(n log n), अतिरिक्त स्थान O(n)

संदर्भ

यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।

दूसरों से सीखें

समुदाय समाधान

अभी तक कोई प्रकाशित समाधान नहीं। पहला साझा करने के लिए इस चुनौती को हल करें।