给定一个数组,任务是计算可以由数组元素形成的所有可能的最大面积矩形的总和。此外,您最多可以将数组的元素减少1。
例子 :
Input: a = {10, 10, 10, 10, 11,
10, 11, 10}
Output: 210
Explanation:
We can form two rectangles one square (10 * 10)
and one (11 * 10). Hence, total area = 100 + 110 = 210.
Input: a = { 3, 4, 5, 6 }
Output: 15
Explanation:
We can reduce 4 to 3 and 6 to 5 so that we got
rectangle of (3 * 5). Hence area = 15.
Input: a = { 3, 2, 5, 2 }
Output: 0
天真的方法:检查数组中所有可能的四个元素,然后检查哪个可以形成矩形。在这些矩形中,将所有这些元素形成的最大面积的所有矩形分开。得到矩形及其面积后,将它们全部求和即可得到我们想要的解决方案。
高效方法:要获得最大面积的矩形,请先按非递增数组对数组中的元素进行排序。排序后,开始执行该过程以选择数组的元素。在这里,如果数组的元素相等(a [i] == a [i + 1])或较小元素a [i + 1]的长度为1,则可以选择数组的两个元素(矩形的长度)小于a [i](在这种情况下,我们有a [i + 1]的长度,因为a [i]减少了1 )。维护一个标志变量以检查我们是否同时获得长度和宽度。得到长度后,设置标志变量,现在以与对长度相同的方式计算宽度,并对矩形的面积求和。在获得长度和宽度后,再次将标志变量设置为false,以便我们现在将搜索新的矩形。重复此过程,最后返回该区域的最终总和。
C++
// CPP code to find sum of all
// area rectangle possible
#include
using namespace std;
// Function to find
// area of rectangles
int MaxTotalRectangleArea(int a[],
int n)
{
// sorting the array in
// descending order
sort(a, a + n, greater());
// store the final sum of
// all the rectangles area
// possible
int sum = 0;
bool flag = false;
// temporary variable to store
// the length of rectangle
int len;
for (int i = 0; i < n; i++)
{
// Selecting the length of
// rectangle so that difference
// between any two number is 1
// only. Here length is selected
// so flag is set
if ((a[i] == a[i + 1] || a[i] -
a[i + 1] == 1) && (!flag))
{
// flag is set means
// we have got length of
// rectangle
flag = true;
// length is set to
// a[i+1] so that if
// a[i] a[i+1] is less
// than by 1 then also
// we have the correct
// choice for length
len = a[i + 1];
// incrementing the counter
// one time more as we have
// considered a[i+1] element
// also so.
i++;
}
// Selecting the width of rectangle
// so that difference between any
// two number is 1 only. Here width
// is selected so now flag is again
// unset for next rectangle
else if ((a[i] == a[i + 1] ||
a[i] - a[i + 1] == 1) && (flag))
{
// area is calculated for
// rectangle
sum = sum + a[i + 1] * len;
// flag is set false
// for another rectangle
// which we can get from
// elements in array
flag = false;
// incrementing the counter
// one time more as we have
// considered a[i+1] element
// also so.
i++;
}
}
return sum;
}
// Driver code
int main()
{
int a[] = { 10, 10, 10, 10,
11, 10, 11, 10,
9, 9, 8, 8 };
int n = sizeof(a) / sizeof(a[0]);
cout << MaxTotalRectangleArea(a, n);
return 0;
}
Java
// Java code to find sum of
// all area rectangle possible
import java.io.*;
import java.util.Arrays;
import java.util.*;
class GFG
{
// Function to find
// area of rectangles
static int MaxTotalRectangleArea(Integer []a,
int n)
{
// sorting the array in
// descending order
Arrays.sort(a, Collections.reverseOrder());
// store the final sum of
// all the rectangles area
// possible
int sum = 0;
boolean flag = false;
// temporary variable to
// store the length of rectangle
int len = 0;
for (int i = 0; i < n; i++)
{
// Selecting the length of
// rectangle so that difference
// between any two number is 1
// only. Here length is selected
// so flag is set
if ((a[i] == a[i + 1] ||
a[i] - a[i+1] == 1) &&
!flag)
{
// flag is set means
// we have got length of
// rectangle
flag = true;
// length is set to
// a[i+1] so that if
// a[i] a[i+1] is less
// than by 1 then also
// we have the correct
// choice for length
len = a[i+1];
// incrementing the counter
// one time more as we have
// considered a[i+1] element
// also so.
i++;
}
// Selecting the width of rectangle
// so that difference between any
// two number is 1 only. Here width
// is selected so now flag is again
// unset for next rectangle
else if ((a[i] == a[i + 1] ||
a[i] - a[i+1] == 1) &&
(flag))
{
// area is calculated for
// rectangle
sum = sum + a[i+1] * len;
// flag is set false
// for another rectangle
// which we can get from
// elements in array
flag = false;
// incrementing the counter
// one time more as we have
// considered a[i+1] element
// also so.
i++;
}
}
return sum;
}
// Driver code
public static void main (String args[])
{
Integer []a = { 10, 10, 10, 10,
11, 10, 11, 10,
9, 9, 8, 8 };
int n = a.length;
System.out.print(MaxTotalRectangleArea(a, n));
}
}
// This code is contributed by
// Manish Shaw(manishshaw1)
Python3
# Python3 code to find sum
# of all area rectangle
# possible
# Function to find
# area of rectangles
def MaxTotalRectangleArea(a, n) :
# sorting the array in
# descending order
a.sort(reverse = True)
# store the final sum of
# all the rectangles area
# possible
sum = 0
flag = False
# temporary variable to store
# the length of rectangle
len = 0
i = 0
while (i < n-1) :
if(i != 0) :
i = i + 1
# Selecting the length of
# rectangle so that difference
# between any two number is 1
# only. Here length is selected
# so flag is set
if ((a[i] == a[i + 1] or
a[i] - a[i + 1] == 1)
and flag == False) :
# flag is set means
# we have got length of
# rectangle
flag = True
# length is set to
# a[i+1] so that if
# a[i+1] is less than a[i]
# by 1 then also we have
# the correct chice for length
len = a[i + 1]
# incrementing the counter
# one time more as we have
# considered a[i+1] element
# also so.
i = i + 1
# Selecting the width of rectangle
# so that difference between any
# two number is 1 only. Here width
# is selected so now flag is again
# unset for next rectangle
elif ((a[i] == a[i + 1] or
a[i] - a[i + 1] == 1)
and flag == True) :
# area is calculated for
# rectangle
sum = sum + a[i + 1] * len
# flag is set false
# for another rectangle
# which we can get from
# elements in array
flag = False
# incrementing the counter
# one time more as we have
# considered a[i+1] element
# also so.
i = i + 1
return sum
# Driver code
a = [ 10, 10, 10, 10, 11, 10,
11, 10, 9, 9, 8, 8 ]
n = len(a)
print (MaxTotalRectangleArea(a, n))
# This code is contributed by
# Manish Shaw (manishshaw1)
C#
// C# code to find sum of all area rectangle
// possible
using System;
class GFG {
// Function to find
// area of rectangles
static int MaxTotalRectangleArea(int []a,
int n)
{
// sorting the array in descending
// order
Array.Sort(a);
Array.Reverse(a);
// store the final sum of all the
// rectangles area possible
int sum = 0;
bool flag = false;
// temporary variable to store the
// length of rectangle
int len =0;
for (int i = 0; i < n; i++)
{
// Selecting the length of
// rectangle so that difference
// between any two number is 1
// only. Here length is selected
// so flag is set
if ((a[i] == a[i + 1] || a[i] -
a[i + 1] == 1) && (!flag))
{
// flag is set means
// we have got length of
// rectangle
flag = true;
// length is set to
// a[i+1] so that if
// a[i] a[i+1] is less
// than by 1 then also
// we have the correct
// choice for length
len = a[i + 1];
// incrementing the counter
// one time more as we have
// considered a[i+1] element
// also so.
i++;
}
// Selecting the width of rectangle
// so that difference between any
// two number is 1 only. Here width
// is selected so now flag is again
// unset for next rectangle
else if ((a[i] == a[i + 1] ||
a[i] - a[i + 1] == 1) && (flag))
{
// area is calculated for
// rectangle
sum = sum + a[i + 1] * len;
// flag is set false
// for another rectangle
// which we can get from
// elements in array
flag = false;
// incrementing the counter
// one time more as we have
// considered a[i+1] element
// also so.
i++;
}
}
return sum;
}
// Driver code
static public void Main ()
{
int []a = { 10, 10, 10, 10,
11, 10, 11, 10,
9, 9, 8, 8 };
int n = a.Length;
Console.WriteLine(
MaxTotalRectangleArea(a, n));
}
}
// This code is contributed by anuj_67.
PHP
输出
282
时间复杂度: O(nlog(n))
辅助空间: O(1)