首先明白题目的含义:mn表示的是一个矩阵,初始化为0。再依次在满足条件的矩形内+1,最后找出最大数字的个数。我们只需要找到最小的长和宽即可。
int maxCount(int m, int n, int** ops, int opsSize, int* opsColSize) {
if(opsSize==0)
{
return m*n;
}
int min1=ops[0][0],min2=ops[0][1];
for(int i=1;i<opsSize;i++)
{
if(ops[i][0]<min1)
{
min1=ops[i][0];
}
if(ops[i][1]<min2)
{
min2=ops[i][1];
}
}
return min1*min2;
}
思路:只遍历一次,对于每一块地只有两种情况
1此地无花 1)上一块地有花,这块地·不能种花
2)上一块地没有花,这块地能种花,count++
2此地有花 因为这是从前往后判断,所以当判断上一块地可以种花时,而这块地已经有花了,上块地就不能种花了,count--
bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
int p=0,count=0;
for(int i=0;i<flowerbedSize;++i)
{
if(flowerbed[i])//如果这块地有花
{
if(p)//上块地有花
{
count--;
}
p=1;
}
else
{
if(p==0)
{
count++;//如果上一块地无花
p=1;
}
else{
p=0;
}
}
}
return count>=n?true:false;
}
首先将数组排序,如果数组中全是非负数,那么排序后的后三个数相乘即为最大值,如果全为非正数,那么最大的三个数相乘也为最大值。
如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int maximumProduct(int* nums, int numsSize) {
qsort(nums,numsSize,sizeof(int),cmp);
return fmax(nums[0]*nums[1]*nums[numsSize-1],nums[numsSize-3]*nums[numsSize-2]*nums[numsSize-1]);
}