请程式大师进来帮我一下

楼主: oin1104 (是oin的说)   2023-12-24 17:46:14
https://leetcode.com/problems/maximum-square-area-by-removing-fences-from-a-fiel
d/description/
题目:
在一堆竿子围成的矩形
移除中间任意竿子
所能做出的最大正方形
我的解法:
只要在意差距形成的宽
我把横的的竿子的差距算出来放进hashtable里面
然后再用直的竿子的差距查hashtable 里面的值是否存在
找出最大的正方形回传
问题:
测资的值太大的话不知道为什么会TLE
值多的话好像还好
我想知道我错在哪里
这题时间限制也太鸡巴了吧
int cmp (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int maximizeSquareArea(int m, int n, int* hFences, int hFencesSize, int* vFences
, int vFencesSize)
{
long long ans = -1;
int ans1 = -1;
int h[hFencesSize+2];
for(int i = 0 ; i < hFencesSize ; i ++)
{
h[i] = hFences[i];
}
h[hFencesSize] = 1;
h[hFencesSize+1] = m;
int v[vFencesSize+2];
for(int i = 0 ; i < vFencesSize ; i ++)
{
v[i] = vFences[i];
}
v[vFencesSize] = 1;
v[vFencesSize+1] = n;
int dl = 0;
int dr = hFencesSize+1;
int d = 0;
int dmap[2181271]={};
int dm = 0;
for(int i = 0 ; i < hFencesSize+2 ; i++)
{
for(int j = i ; j < hFencesSize+2 ; j++)
{
int height = abs(h[i] - h[j]);
int key = height%(2181271);
int keys = key;
if(dmap[key] == 0 )
{
dmap[key] = height;
continue;
}
while(1)
{
if((dmap[key] == height) || (dmap[key] == 0 ))
{
dmap[key] = height;
break;
}
else
{
key += keys;
if(key >= 2181271)
{
key -= 2181271;
}
}
}
}
}
for(int i = 0 ; i < vFencesSize+2 ; i++)
{
for(int j = i ; j < vFencesSize+2 ; j++)
{
int width = abs(v[i] - v[j]);
int key = width%(2181271);
int keys = key;
while(1)
{
if( dmap[key] == width )
{
long long ans2 = ((long long)dmap[key]) * ((long long)dmap[k
ey]);
if(ans2 > ans)
{
ans = ans2;
}
break;
}
else if (dmap[key] == 0 )
{
break;
}
else
{
key += keys;
if(key >= 2181271)
{
key -= 2181271;
}
}
}
}
}
ans1 = ans %1000000007;
if(ans1 == 0 )
{
return -1;
}
return ans1;
}
好想打手枪
作者: Rushia (みけねこ的鼻屎)   2023-12-24 17:49:00
m和n最大长度是10^9 两个FOR一定会超时
作者: sustainer123 (caster)   2023-12-24 17:49:00
降低时间复杂度
作者: Rushia (みけねこ的鼻屎)   2023-12-24 17:52:00
看错了是600 600两个循环是还好
楼主: oin1104 (是oin的说)   2023-12-24 17:52:00
他的mn 就竿子数量 是600欸应该没事 对ㄚ
作者: Rushia (みけねこ的鼻屎)   2023-12-24 17:53:00
那就是你中间的运算过程太浪费时间了
楼主: oin1104 (是oin的说)   2023-12-24 17:53:00
我流泪了
作者: devilkool (对猫毛过敏的猫控)   2023-12-24 17:54:00
今天周赛那个吗 你两个for里面又有while耶
楼主: oin1104 (是oin的说)   2023-12-24 17:55:00
对 周赛 我那个while是为了hashtable两个for应该不会超过600*600 再多*一个找hashtable 的应该不会太久 八

Links booklink

Contact Us: admin [ a t ] ucptt.com