Tugasnya ialah mencari luas segi empat tepat terbesar yang boleh dibentuk dalam histogram. Setiap bar dalam histogram mempunyai lebar 1, dan ketinggian setiap bar diberikan oleh tatasusunan integer bukan negatif.
Sebagai contoh, memandangkan tatasusunan ketinggian [2, 1, 5, 6, 2, 3], luas segi empat tepat terbesar dalam histogram ialah 10.
Masalah ini boleh diselesaikan dengan cekap menggunakan pendekatan berasaskan tindanan. Pendekatan ini melibatkan pengekalan timbunan untuk menjejaki indeks bar histogram, membolehkan kami mengira kawasan segi empat tepat maksimum dalam masa linear. Berikut ialah pecahan terperinci algoritma:
Kami mengulangi tatasusunan ketinggian dari kiri ke kanan dan juga menambah bar maya terakhir dengan ketinggian 0 pada penghujung tatasusunan untuk memastikan semua bar diproses.
Langkah dalam lelaran:
Tekan Indeks Bar Semasa: Untuk setiap bar, tolak indeksnya ke tindanan. Walau bagaimanapun, sebelum melakukan itu, kita perlu memastikan bahawa bar semasa adalah lebih tinggi daripada bar pada indeks yang disimpan di bahagian atas tindanan. Jika tidak, kami meletuskan bar daripada timbunan untuk mengira luas segi empat tepat yang boleh dibentuk menggunakan bar pada indeks yang timbul sebagai bar terkecil (iaitu, ketinggian segi empat tepat).
Pop dari Tindanan dan Kira Kawasan:
Selepas melelaran semua bar, mungkin masih ada beberapa bar yang tinggal dalam tindanan. Bar ini akan mempunyai ketinggian yang tidak diproses kerana tiada bar yang lebih pendek di sebelah kanan. Kita perlu memproses baki bar ini dengan cara yang sama dengan mengeluarkannya dari timbunan dan mengira kawasan.
Berikut ialah kod JavaScript dengan ulasan yang menerangkan setiap bahagian:
/** * @param {number[]} heights * @return {number} */ var largestRectangleArea = function(heights) { var len = heights.length; var stack = []; var max = 0; var h = 0; var w = 0; // Iterate through the heights array for (var i = 0; i <= len; i++) { // Ensure the loop processes the virtual bar with height 0 at the end while (stack.length && (i === len || heights[i] <= heights[stack[stack.length - 1]])) { // Pop the top index from the stack h = heights[stack.pop()]; // Calculate the width of the rectangle w = stack.length === 0 ? i : i - stack[stack.length - 1] - 1; // Update the maximum area found so far max = Math.max(max, h * w); } // Push the current index onto the stack stack.push(i); } return max; };
Atas ialah kandungan terperinci Segiempat Terbesar dalam Histogram. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!