برنامه نویسی

2161. آرایه پارتیشن مطابق با محوری داده شده

2161. آرایه پارتیشن مطابق با محوری داده شده

مشکل: واسطه

مباحث: Arrayبا Two Pointersبا Simulation

به شما داده می شود 0-شاخص آرایه عدد صحیح nums و یک عدد صحیح pivotبشر دوباره تنظیم کردن nums به گونه ای که شرایط زیر راضی باشد:

  • هر عنصر کمتر از pivot ظاهر شدن پیش از هر عنصر بزرگتر از pivotبشر
  • هر عنصر برابر با pivot ظاهر شدن در میان عناصر کمتر از و بیشتر از pivotبشر
  • در ترتیب نسبی از عناصر کمتر از pivot و عناصر بزرگتر از pivot حفظ می شود
    • به طور رسمی ، همه را در نظر بگیرید piبا pj کجا pi موقعیت جدید ith عنصر pj موقعیت جدید jth عنصر. اگر i < j وت هر دو عناصر کوچکتر هستند (یا بزرگتر) از pivot، پس pi < pjبشر

بازگشت nums بعد از تنظیم مجددبشر

مثال 1:

  • ورودی: nums = [9,12,5,10,14,3,10]، Pivot = 10
  • خروجی: [9,5,3,10,10,12,14]
  • توضیح:

    • عناصر 9 ، 5 و 3 کمتر از محوری هستند بنابراین در سمت چپ آرایه قرار دارند.
    • عناصر 12 و 14 از محوری بیشتر هستند بنابراین در سمت راست آرایه قرار دارند.
    • ترتیب نسبی عناصر کمتر از و بیشتر از Pivot نیز حفظ می شود. [9, 5, 3] وت [12, 14] سفارشات مربوطه هستند

مثال 2:

  • ورودی: nums = [-3,4,3,2]، Pivot = 2
  • خروجی: [-3,2,4,3]
  • توضیح:

    • عنصر -3 کمتر از محوری است بنابراین در سمت چپ آرایه قرار دارد.
    • عناصر 4 و 3 از محوری بیشتر هستند بنابراین در سمت راست آرایه قرار دارند.
    • ترتیب نسبی عناصر کمتر از و بیشتر از Pivot نیز حفظ می شود. [-3] وت [4, 3] سفارشات مربوطه هستند

محدودیت ها:

  • 1 <= nums.length <= 105
  • -106 <= nums[i] <= 106
  • pivot برابر با یک عنصر از numsبشر

نکته:

  1. آیا می توانید عناصر را کوچکتر از محوری و بیشتر از محوری در یک لیست جداگانه مانند دنباله ای که رخ می دهد قرار دهید؟
  2. با استفاده از لیست های جداگانه تولید شده ، آیا می توانید نتیجه را تولید کنید؟

راه حل:

ما باید آرایه ای را به گونه ای تنظیم کنیم که عناصر کمتر از یک محوری مشخص ابتدا ظاهر شوند ، و به دنبال آن عناصر برابر با محوری و در نهایت عناصر بزرگتر از محوری. ترتیب نسبی عناصر در کمتر از و بیشتر از گروه ها باید حفظ شود.

فهرست مطالب

رویکرد

  1. عناصر جداگانه به گروه ها: ما می توانیم عناصر را به سه گروه تقسیم کنیم:

    • عناصر کمتر از محوری.
    • عناصر برابر با محوری.
    • عناصر بزرگتر از محوری.
  2. نظم نسبی را حفظ کنید: با تکرار از طریق آرایه و اضافه کردن عناصر به گروه های مربوطه ، ما نظم نسبی آنها را همانطور که در آرایه اصلی ظاهر می شوند ، حفظ می کنیم.

  3. گروه ها: در آخر ، سه گروه (کمتر از ، برابر و بیشتر از) را برای تشکیل آرایه تنظیم شده جمع کنید.

این رویکرد تضمین می کند که ترتیب نسبی عناصر در گروه های کمتر از و بیشتر از گروه ها حفظ می شود ، در حالی که عناصر برابر با محوری در وسط قرار می گیرند.

بیایید این راه حل را در PHP پیاده سازی کنیم: 2161. آرایه پارتیشن مطابق با محوری داده شده


/**
 * @param Integer[] $nums
 * @param Integer $pivot
 * @return Integer[]
 */
function pivotArray($nums, $pivot) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

// Test cases
print_r(pivotArray([9,12,5,10,14,3,10], 10));
print_r(pivotArray([-3,4,3,2], 2));
?>
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

توضیح:

  • جدایی به گروه ها: ما از طریق هر عنصر در آرایه ورودی تکرار می کنیم و هر عنصر را بر اساس رابطه آن با محوری (کمتر از ، برابر یا بیشتر از) در یکی از سه گروه طبقه بندی می کنیم. این طبقه بندی در یک پاس واحد از طریق آرایه انجام می شود و از پیچیدگی زمان O (n) اطمینان حاصل می شود.
  • سفارش: با افزودن عناصر به گروه های مربوطه به ترتیب که در آرایه اصلی ظاهر می شوند ، ما ترتیب نسبی آنها را در هر گروه حفظ می کنیم.
  • هماهنگی: ادغام سه گروه (کمتر از ، برابر ، بیشتر از) استفاده array_merge در PHP ترتیب نهایی صحیح را تضمین می کند ، با تمام عناصر کمتر از محور اول ، و به دنبال آن برابر با محوری و در نهایت آنهایی که بیشتر از محوری هستند.

این رویکرد به طور موثری آرایه را در فضای O (n) و O (n) تنظیم می کند ، که برای محدودیت های مشکل خاص بهینه است.

پیوندهای تماس

اگر این سریال را مفید دیدید ، لطفاً در نظر بگیرید مخزن یک ستاره در GitHub یا به اشتراک گذاری پست در شبکه های اجتماعی مورد علاقه خود. حمایت شما برای من بسیار معنی دارد!

اگر می خواهید مطالب مفید تری مانند این ، احساس راحتی کنید که از من پیروی کنید:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا