با توجه به مجموعه ای از اعداد صحیح مثبت ، تعداد مثلث هایی را که می توان با سه عنصر آرایه مختلف به عنوان سه طرف مثلث تشکیل داد ، پیدا کنید. برای اینکه یک مثلث از 3 مقدار امکان پذیر باشد ، جمع هر یک از دو مقدار (یا طرف) باید بیشتر از مقدار سوم (یا طرف سوم) باشد.
مثال ها:
ورودی: arr = خروجی: 3 توضیح: سه مثلث ممکن است ، و. توجه داشته باشید که یک مثلث ممکن نیست.
ورودی: arr =. خروجی: 6 توضیح: 6 مثلث ممکن وجود دارد: ، ، ، و
تمرین توصیه شده
رویکرد ساده لوح:برای حل مشکل ، ایده زیر را دنبال کنید:
روش Brute Force اجرای سه حلقه و پیگیری تعداد مثلث های ممکن تا کنون است. سه حلقه سه مقدار مختلف را از یک آرایه انتخاب می کنند. حلقه درونی برای خاصیت مثلث که میزان هر دو طرف را مشخص می کند باید بیشتر از مقدار طرف سوم باشد).
مراحل داده شده را برای حل مشکل دنبال کنید:
- سه حلقه تو در تو را اجرا کنید هر حلقه از شاخص حلقه قبلی تا انتهای آرایه یعنی حلقه اول را از 0 تا n ، حلقه J از I تا N و K از J تا N اجرا کنید
- Check if array[i] + array[j]>آرایه [k] ، یعنی جمع دو طرف بیشتر از سوم است
- شرایط 2 را برای همه ترکیب های طرفین با تعویض I ، J ، K بررسی کنید
- اگر هر سه شرط مطابقت دارد ، پس تعداد را افزایش دهید
- شمارش را چاپ کنید
در زیر اجرای رویکرد فوق آورده شده است:
C++
// کد C ++ برای شمارش تعداد مثلث های احتمالی با استفاده از // رویکرد نیروی بی رحمانه #عبارتند از با استفاده از namespace std ؛ // عملکرد برای شمارش تمام مثلث های ممکن با arr [] // عناصر int findNumberOfTriangles (int arr [] ، int n) // تعداد مثلث ها int count = 0 ؛ // سه حلقه سه مقدار مختلف را از // آرایه برای (int i = 0 ؛ iarr [k] && arr[i] + arr[k]>arr [j] && arr[k] + arr[j]>arr [i]) تعداد ++ ؛ تعداد بازگشت ؛ // کد درایور int main () int arr [] =<10, 21, 22, 100, 101, 200, 300>; اندازه int = sizeof (arr) / sizeof (arr [0]) ؛ // تماس عملکرد چاک<<"Total number of triangles possible is " <C // کد C برای شمارش تعداد مثلث های احتمالی با استفاده از // رویکرد نیروی بی رحمانه #عبارتند از // عملکرد برای شمارش تمام مثلث های ممکن با arr [] // عناصر int findNumberOfTriangles (int arr [] ، int n) // تعداد مثلث ها int count = 0 ؛ // سه حلقه سه مقدار مختلف را از // آرایه برای (int i = 0 ؛ iarr [k] && arr[i] + arr[k]>arr [j] && arr[k] + arr[j]>arr [i]) تعداد ++ ؛ تعداد بازگشت ؛ // کد درایور int main () int arr [] =<10, 21, 22, 100, 101, 200, 300>; اندازه int = sizeof (arr) / sizeof (arr [0]) ؛ // تماس عملکرد printf ("تعداد کل مثلث ممکن ٪ D است" ، FindNumberOfTriangles (ARR ، اندازه)) ؛ بازگشت 0 ؛ // این کد توسط Sania Kumari Gupta کمک می کند
جاوا
// کد جاوا برای شمارش تعداد مثلث های احتمالی با استفاده از // رویکرد نیروی بی رحمانه وارد کردن java. io.*؛ وارد کردن java. util.*؛ GFG کلاس< // عملکرد برای شمارش تمام مثلث های ممکن با arr [] // عناصر static int findNumberOfTriangles (int arr [] ، int n) // مرتب سازی آرایه arrays. sort (arr) ؛ // تعداد مثلث ها int count = 0 ؛ // سه حلقه سه مقدار مختلف را انتخاب می کنند // از آرایه برای (int i = 0 ؛ iarr [k]) تعداد ++ ؛ تعداد بازگشت ؛ // کد درایور عمومی استاتیک اصلی اصلی (رشته [] args) int arr [] =<10 , 21 , 22 , 100 , 101 , 200 , 300>; اندازه int = arr. l طول ؛ // تماس عملکرد system. out. println ( "تعداد کل مثلث ممکن است" + FindNumberOfTriangles (ARR ، اندازه)) ؛ // این کد توسط Sania Kumari Gupta کمک می کندپایتون 3
# کد Python3 برای شمارش تعداد # مثلث های احتمالی با استفاده از بی رحم # رویکرد نیرو # عملکرد برای شمارش همه ممکن # مثلث با arr [] عناصر def FindNumberOfTriangles (arr ، n): # تعداد مثلث ها تعداد = 0 # سه حلقه سه را انتخاب می کنند # مقادیر مختلف از آرایه برای من در محدوده (n): برای j در محدوده (i + 1 ، n): # حلقه درونی ترین بررسی می کند # خاصیت مثلث برای k در محدوده (j + 1 ، n): # جمع دو طرف بیشتر است # از سوم if (arr[i] + arr[j]>arr [k] و arr[i] + arr[k]>arr [j] و arr[k] + arr[j]>arr [i]): تعداد + = 1 تعداد بازگشت # کد درایور اگر __name__ = = "__main__": arr = [10 ، 21 ، 22 ، 100 ، 101 ، 200 ، 300] اندازه = len (arr) # تماس عملکرد چاپ ("تعداد کل مثلث ممکن است" ، findNumberofTriangles (arr ، size)) # این کد توسط Shubhamsingh10 کمک می کندC#
// c# کد برای شمارش تعداد // مثلث های احتمالی با استفاده از بی رحم // رویکرد نیرو استفاده از سیستم ؛ GFG کلاس< // عملکرد برای شمارش همه ممکن // مثلث با arr [] عناصر static int findNumberOfTriangles (int [] arr ، int n) // تعداد مثلث ها int count = 0 ؛ // سه حلقه سه را انتخاب می کنند // مقادیر مختلف از آرایه برای (int i = 0 ؛ iarr [k] && arr[i] + arr[k]>arr [j] && arr[k] + arr[j]>arr [i]) تعداد ++ ؛ تعداد بازگشت ؛ // کد درایور استاتیک عمومی باطل اصلی () int [] arr =<10, 21, 22, 100, 101, 200, 300>; اندازه int = arr. l طول ؛ // تماس عملکرد Console. Writeline ( "تعداد کل مثلث ممکن است" + FindNumberOfTriangles (ARR ، اندازه)) ؛ // این کد توسط Shubhamsingh10 کمک می کندجاذب
// برنامه JavaScript برای رویکرد فوق // عملکرد برای شمارش همه ممکن // مثلث با arr [] عناصر عملکرد FindNumberofTriangles (arr ، n) // تعداد مثلث ها اجازه دهید تعداد = 0 ؛ // سه حلقه سه را انتخاب می کنند // مقادیر مختلف از آرایه برای (بگذارید من = 0 ؛ منarr [k] && arr[i] + arr[k]>arr [j] && arr[k] + arr[j]>arr [i]) تعداد ++ ؛ تعداد بازگشت ؛ // کد درایور اجازه دهید arr = [10 ، 21 ، 22 ، 100 ، 101 ، 200 ، 300] ؛ اجازه دهید اندازه = arr. l طول ؛ Document. Write ("تعداد کل مثلث ممکن است" + FindNumberOfTriangles (ARR ، اندازه)) ؛ // این کد توسط Souravghosh0416 کمک می کند. خروجیتعداد کل مثلث ممکن 6 است
پیچیدگی زمان: o (n 3) که در آن n اندازه فضای کمکی آرایه ورودی است: O (1)
تعداد مثلث های ممکن را با استفاده از مرتب سازی بشمارید:
برای حل مشکل ، ایده زیر را دنبال کنید:
ابتدا آرایه را به ترتیب صعودی مرتب کنید. سپس از دو حلقه استفاده کنید. حلقه بیرونی برای رفع قسمت اول و حلقه داخلی برای رفع سمت دوم و سپس دورترین شاخص طرف سوم (بیشتر از شاخص های هر دو طرف) که طول آن کمتر از مجموع دو طرف دیگر است. بنابراین طیف وسیعی از مقادیر سمت سوم را می توان یافت ، جایی که تضمین می شود که طول آن بیشتر از طرف های دیگر است اما کمتر از جمع هر دو طرف است.
بگذارید A ، B و C سه طرف باشند. شرایط زیر باید برای یک مثلث صادق باشد (مجموع دو طرف از طرف سوم بیشتر است)
مراحل داده شده را برای حل مشکل دنبال کنید:
- آرایه را به ترتیب صعودی مرتب کنید.
- اکنون یک حلقه تو در تو را اجرا کنید. حلقه بیرونی از ابتدا تا انتها اجرا می شود و حلقه داخلی از فهرست + 1 حلقه اول تا انتها اجرا می شود. پیشخوان حلقه اول را به عنوان من و حلقه دوم به عنوان j بگیرید. متغیر دیگری را K = I + 2 بگیرید
- Now there are two pointers i and j, where array[i] and array[j] represent two sides of the triangles. For a fixed i and j , find the count of third sides which will satisfy the conditions of a triangle. i.e find the largest value of array[k] such that array[i] + array[j]>آرایه [k]
- بنابراین وقتی بزرگترین مقدار را بدست می آوریم ، تعداد طرف سوم K - J است ، آن را به تعداد کل اضافه کنید.
- اکنون برای همه جفت های معتبر من و j جایی که من جمع می کنم
در زیر اجرای رویکرد فوق آورده شده است:
اخبار رمز ارزها...
ما را در سایت اخبار رمز ارزها دنبال می کنید
برچسب :
نویسنده : منیژه سلیمی
بازدید : <-PostHit->
تاريخ : چهارشنبه
15 شهريور
1402 ساعت: 14:09