ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ที่ยืนยันค่าจำนวนเต็ม N ค่า งานของเราคือค้นหาค่าสูงสุดของ abs(i – j) * min(arr[i], arr[j]) ใน arrayarr[]
คำอธิบายปัญหา − เราจำเป็นต้องค้นหามูลค่าผลิตภัณฑ์สูงสุดของค่าต่ำสุดของสององค์ประกอบและความแตกต่างสัมบูรณ์ระหว่างดัชนีของพวกมัน นั่นคือ สำหรับสองค่า i และ j เราจำเป็นต้องขยายให้ใหญ่สุด abs(i - j) * min(arr[i] , arr[j])
อินพุต
arr[] = {5, 7, 3, 6, 4}
ผลลัพธ์
16
คำอธิบาย
The maximum value is 16, between index 0 and 4 => abs(0 - 4)*min(arr[0], arr[4]) => 4*min(5, 4) => 4*4 = 16
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือการใช้การวนซ้ำซ้อน เราจะใช้ twoloop และคำนวณค่าสำหรับแต่ละคู่ของ i และ j แล้วคืนค่าสูงสุดของค่าทั้งหมดที่พบ
วิธีนี้เป็นวิธีที่ดีแต่มีเวลาที่ซับซ้อนของคำสั่ง O(n 2 )
วิธีแก้ปัญหาที่มีประสิทธิภาพคือการใช้ค่าตัววนซ้ำสองค่า จากจุดเริ่มต้นอีกค่าหนึ่งจากส่วนท้ายของอาร์เรย์ สำหรับแต่ละค่าของ iterators เราจะค้นหาค่าที่ต้องการและเปรียบเทียบและเก็บตัวแปร inmaxVal สูงสุด เราจะทำเช่นนี้จนกว่าตัววนซ้ำทั้งสองจะข้ามกันและในตอนท้ายจะคืนค่า maxVal
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include<iostream> using namespace std; int calcMaxProdValue(int arr[], int n) { int maxVal = -100; int currentVal; int start = 0, end = n-1; while (start < end) { if (arr[start] < arr[end]) { currentVal = arr[start]*(end-start); start++; } else { currentVal = arr[end]*(end-start); end--; } maxVal = max(maxVal, currentVal); } return maxVal; } int main(){ int arr[] = {5, 7, 3, 6, 4}; int n = sizeof(arr)/sizeof(arr[0]); cout<<"The maximum value of abs(i – j) * min(arr[i], arr[j]) in an array is "<<calcMaxProdValue(arr,n); return 0; }
ผลลัพธ์
The maximum value of abs(i – j) * min(arr[i], arr[j]) in an array is 16