Menu
CoddyTech

Count Inversions

בינונימיוןרקורסיהpython iconjava iconcpp iconc iconjs icon+10

בהינתן רשימה של מספרים שלמים nums, החזר את מספר ההיפוכים: זוגות של אינדקסים i < j שעבורם nums[i] > nums[j], כלומר ערך גדול יותר מופיע לפני ערך קטן יותר. ערכים שווים לעולם אינם יוצרים היפוך, וברשימה ממוינת אין היפוכים.

פונקציה

countInversions(nums: integer-array) → integer
numsinteger-array
רשימת המספרים השלמים
מחזירהinteger
מספר הזוגות i < j שעבורם nums[i] > nums[j]

אילוצים

  • 1 ≤ nums.length ≤ 2 × 104
  • -104 ≤ nums[i] ≤ 104
  • התשובה היא לכל היותר n(n-1)/2 < 2 × 108, ולכן היא נכנסת למספר שלם מסומן בן 32 סיביות.

דוגמאות

קלט
nums = [5, 3, 8, 1, 4]
פלט
6
הסבר
5 מופיע לפני 3, 1 ו-4: 3 זוגות. 3 מופיע לפני 1, ו-8 לפני 1 ו-4: עוד 3. 1 ו-4 מסודרים לפי הסדר, לכן הסך הכול הוא 6.
challenge icon

שאלת המשך

מה משתנה אם זוג נחשב רק כאשר nums[i] > 2 × nums[j]? האם מיון מיזוג עדיין יכול לספור את הזוגות האלה ב־O(n log n)?

איפוס הקוד
def countInversions(nums):
    # כתבו כאן קוד

בדיקה #1

בדיקה #2

בדיקה #3

ארגומנט

nums = [5, 3, 8, 1, 4]

הפלט הצפוי

6