اگر نمی دانید که الگونوردی چیست، از این لینک بخوانید.
پرسش: یک ماتریس از مقادیر صفر و یک داده شده است. برای هر خانه فاصله نزدیکترین صفر به آن را بیابید.
توجه توجه: برای حل مساله در سایت leetcode.com عضو شوید. برنامه شما زمانی درست است که همه تست ها را پاس کند. از دیدگاه الگونوردی، برنامه شما زمانی کامل است که سرعت آن حداقل از ۹۰ درصد راه حل ها سریع تر باشد. سایت leetcode.com سرعت نسبی برنامه شما را نشان خواهد داد.
زمان بندی: ارسال پاسخ ها تا پایان روز 25 می
نکات مهم:
قوانین اهدای جایزه:
این هفته برنده ای نداشتیم. بنابر این راه حل خودم را اینجا شرح می دهم.
حل:
روش جستجوی کامل برای این مساله به این صورت است:
برای هر خانه غیر صفر، فاصله آن تا تمام خانه های ماتریس با مقدار صفر را بدست آور و کمترین فاصله را به عنوان نتیجه برگردان. در این الگوریتم برای بدست آوردن کمترین فاصله هر خانه غیر صفر همه خانه های ماتریس را باید بررسی کنیم. بنابر این پیچیدگی محاسباتی آن N^4 می باشد.
مشکل این کار آن است که از محاسبات قبلی برای بدست آوردن نتیجه برای خانه های دیگر استفاده نمی شود.
با توجه به اینکه این مساله شباهتهایی با مساله یافتن کوتاهترین مسیر درگراف بین یک راس و تمام راس های دیگر دارد، می توانیم از روش حل دایجکسترا ایده بگیریم. در الگوریتم دایجکسترا از یک گره شروع می کنیم و هر بار مقدار گره های دیگر (که در واقع فاصله آنها تا نقطه شروع را نشان می دهند) را بروز می کنیم. در هر بار یک گره که مقدارآن نهایی نشده است و دارای کمترین مقدار هست را انتخاب می کنیم و مقدار آن را نهایی می کنیم.
در این مساله هر خانه با مقدار صفر یک نقطه شروع است. بنابر این آنها را به یک لیست که شامل خانه های مورد بررسی است قرار می دهیم. با شروع از هر خانه هر بار فاصله خانه های بعدی (بالا-پایین-راست-چپ) را از آن محاسبه و در صورت نیاز بروز می کنیم. در صورتی که مقدار خانه ای بروز شود آن را به لیست خانه های مورد بررسی اضافه می کنیم و این کار را تکرار می کنیم تا جایی که مقدار هیچ خانه ای قابل بروز رسانی نباشد. در این حالت مطمین خواهیم بود که فاصله کمینه برای همه خانه ها را محاسبه کرده ایم.
این راه حل را می توان به عنوان یک پیمایش BFS از هر خانه با مقدار صفر در تصویر نمود با این تفاوت که پیمایش با رسیدن به خانه هایی که مقدار آنها نهایی شده است متوقف می شود. بنابر این پیچیدگی محاسباتی این الگوریتم برابر با اندازه ماتریس یعنی clen*rlen می باشد.
قطعه کد زیر پیاده سازی این الگوریتم را نشان می دهد.