LeetCode 735
Asteroid Collision
Problem Description:
题目大体意思就是给出一串整数(包括正数和负数,不包括零)来描述星体运动过程中产生的碰撞情况。其中,整数的绝对值代表星体的大小,正负号表示星体的运动方向,负号表示向左运动,正号表示向右运动。当两个星体碰撞时,大星体把小星体kill掉,剩下自己独孤求败。
具体的题目信息:
https://leetcode.com/problems/asteroid-collision/description/Solution:
1、用栈实现:观察题目给的example 4可以知道不是所有正负数相见都会打架的。当asteroids[i]为正数时,不管栈顶元素正负,都可以直接push(若栈顶元素为负,栈中星体向左运动,输入的asteroids[i]为正数,栈外星体向右运动,不会碰撞)
2、我比较笨,用栈实现后面返回结果的时候忘记转成vector类型,找了一小会
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids) {
stack<int> result;
if (asteroids.size() == 0)
return asteroids;
for (int i = 0; i < asteroids.size(); i++) {
int flag = 0;
if (result.empty()) {
result.push(asteroids[i]);
continue;
}
if (asteroids[i] > 0) {
result.push(asteroids[i]);
} else {
if (result.top() < 0) {
result.push(asteroids[i]);
} else {
while (!result.empty()&&result.top()>0) {
if (abs(asteroids[i])<result.top()) {
flag = 1;
break;
} else if (abs(asteroids[i]) == result.top()) {
result.pop();
flag = 1;
break;
} else {
result.pop();
}
}
if (flag == 0)
result.push(asteroids[i]);
}
}
}
vector<int> sum;
while (!result.empty()) {
sum.push_back(result.top());
result.pop();
}
for (int i = 0; i < sum.size()/2; i++) {
int temp = sum[sum.size()-i-1];
sum[sum.size()-i-1] = sum[i];
sum[i] = temp;
}
return sum;
}
};