C ++中的小行星碰撞
在所有碰撞之后,我们必须找到小行星的状态。当两个小行星相遇时,较小的一个将爆炸。如果两者大小相同,则两者都会爆炸。朝同一方向移动的两个小行星将永远不会相遇。
因此,如果输入类似于[5,10,-5],则输出将为[5,10]。这里10和-5在10中发生碰撞,那么5和10将永远不会发生碰撞。
为了解决这个问题,我们将遵循以下步骤-
使一个数组为ret,n:=arr的大小
对于i,范围为0至n–1
x:=ret的最后一个元素,从ret删除最后一个元素
absX:=|x|,absY:=|arr[i]|
如果absX=absY,则将i加1
除此以外
如果absX>absY,则将x插入ret,将i增加1
将rr[i]插入ret,将i增加1
如果ret为空或ret的最后一个元素为正,而arr[i]为负,则
除此以外
返回ret
范例(C++)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
bool isNeg(int x){
return x < 0;
}
vector<int> asteroidCollision(vector<int>& arr) {
vector <int> ret;
int n = arr.size();
for(int i = 0; i< n; ){
if(ret.empty() || !(!isNeg(ret[ret.size() - 1]) && isNeg(arr[i]))){
ret.push_back(arr[i]);
i++;
} else {
int x = ret[ret.size() - 1];
ret.pop_back();
int absX = abs(x);
int absY = abs(arr[i]);
if(absX == absY){
i++;
} else {
if(absX > absY){
ret.push_back(x);
i++;
}
}
}
}
return ret;
}
};
main(){
vector<int> v = {5, 10, -4};
Solution ob;
print_vector(ob.asteroidCollision(v));
}输入项
[5,10,-4]
输出结果
[5, 10, ]