Every day a leetcode
题目来源:2126. 摧毁小行星
解法1:贪心
对于两个不同质量的小行星,优先摧毁质量较小的小行星可以摧毁更多的小行星。
所以,基于贪心的思想,将小行星按质量从小到大排序,遍历数组,依次让行星跟它们发生碰撞,每次判断即可:
- 当mass<某个小行星质量时,返回 false;
- 如果遍历完成,则说明所有小行星均可摧毁,此时我们返回 true。
代码:
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
bool asteroidsDestroyed(int mass, int* asteroids, int asteroidsSize){
qsort(asteroids,asteroidsSize,sizeof(int),cmpfunc);
for(int i=0;i<asteroidsSize;i++)
{
if(mass<asteroids[i]) return false;
mass+=asteroids[i];
}
return true;
}
结果: 啊哦,mass 爆 int 了。改成 long 就行了。看提示,所有小行星的质量总和可能超过 32 位有符号整数的上界。
代码:
int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
bool asteroidsDestroyed(int mass, int* asteroids, int asteroidsSize){
long m=mass;
qsort(asteroids,asteroidsSize,sizeof(int),cmpfunc);
for(int i=0;i<asteroidsSize;i++)
{
if(m<asteroids[i]) return false;
m+=asteroids[i];
}
return true;
}
结果:
|