پاسخ سوال مساحت محصور کوئرا
در این نوشته تمرین “سوال مساحت محصور” که در وبسایت کوئرا موجود است را برای شما کاربران عزیز حل کردهایم.
پاسخ سوال مساحت محصور کوئرا
تعدادی تخته با شمارههای ۱ تا در کنار هم داده شده است. ارتفاع تختهی iام h_i متر و عرض آن ۱ متر است. میخواهیم مستطیل با بیشترین مساحت محصور بین این n تخته را بیابیم. منظور از مستطیل محصور بین تختهها، مستطیلی است که سطح آن تماماً درون تختهها قرار گیرد.
ورودی سوال مساحت محصور
در خط اول ورودی عدد و در خط بعد n عدد صحیح نامنفی داده میشود که عدد iام نشاندهندهی ارتفاع تختهی ام است.
خروجی سوال مساحت محصور
در تنها خط خروجی باید مساحت مستطیل خواسته شده را چاپ کنید.
حل سوال مساحت محصور
import java.util.Stack;
import java.util.Scanner;
public class Main
{
static int getMaxArea(int hist[], int n)
{
Stack<Integer> s = new Stack<>();
int max_area = 0;
int tp;
int area_with_top;
int i = 0;
while (i < n)
{
if (s.empty() || hist[s.peek()] <= hist[i])
s.push(i++);
else
{
tp = s.peek();
s.pop();
area_with_top = hist[tp] * (s.empty() ? i : i - s.peek() - 1);
if (max_area < area_with_top)
max_area = area_with_top;
}
}
while (s.empty() == false)
{
tp = s.peek();
s.pop();
area_with_top = hist[tp] * (s.empty() ? i : i - s.peek() - 1);
if (max_area < area_with_top)
max_area = area_with_top;
}
return max_area;
}
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = input.nextInt();
}
System.out.println(getMaxArea(arr, arr.length));
}
}
منبع سوال: وبسایت کوئرا
اگر روش حل بهتری برای”مساحت محصور” دارید برای ما ارسال کنید تا با نام خودتان به اشتراک بگذاریم.
اگر سوال خاصی را مدنظر دارید در بخش نظرات برای ما ارسال کنید تا حل آن سوال را در الویت محتوای سایت بگذاریم.



















چرا از حلقه دوم بعد از while اصلی استفاده شده و بدون آن جواب درست نمیدهد؟
حلقه دوم برای محاسبه مساحت مستطیلهایی است که تا انتهای آرایه ادامه دارند و ممکن است در حلقه اول محاسبه نشده باشند.
چه راهی برای بهینهتر کردن حافظه مصرفی در این الگوریتم وجود دارد؟
برای بهینهتر کردن حافظه مصرفی، میتوان از روشهای مبتنی بر پشته (Stack) استفاده کرد که در کد ارائه شده نیز به کار رفته است. این روش به طور کلی کارآمد است.
اگر ارتفاعها همه برابر باشند، نتیجه به چه صورت خواهد بود؟
اگر ارتفاعها همه برابر باشند، مساحت مستطیل محصور برابر با حاصلضرب ارتفاع مشترک در تعداد تختهها خواهد بود.
چرا از Stack برای حل این سوال استفاده شده و راه سادهتری هم هست؟
استفاده از Stack در این الگوریتم بهینهترین راه برای یافتن مساحت بیشینه در زمان خطی است، اما روشهای دیگری نیز با پیچیدگی زمانی بالاتر وجود دارند.
آیا این روش روی آرایههای خیلی بزرگ هم کارایی مناسبی دارد؟
بله، این روش که از پشته (Stack) استفاده میکند، برای آرایههای بزرگ نیز کارایی مناسبی دارد و پیچیدگی زمانی آن O(n) است.