枪打出头鸟
题解
解法一:
对于每个人,都暴力遍历,找到在我之前比我高的第一个人,计算答案。
时间复杂度O()
这样肯定会超时
解法二:
tag:栈
我们可以发现如果我比前面一个人高,因为枪打出头鸟,我前面一个人无论如何都不会被打到了,于是他就可以被删除,他不会对答案再产生任何贡献。
于是我们可以开一个栈,每一次拿我的身高和栈顶元素来比较:
1.如果栈顶比我大,那么直接计算答案,将当前我的身高放入栈中。
2.如果栈顶比我小,那么我们直接可以将他弹出,因为他不会再被子弹击中,然后不断执行上述操作,直到栈为空,或者栈顶元素比我大,停止操作,把当前我的身高放入栈中。
于是我们可以通过维护这样一个栈来计算答案。
我们可以发现其实这个栈维护了一个单调递减的序列,也被称为单调栈。
时间复杂度O(n)
空间复杂度O(n)
class Solution { public: /** * * @param n int整型 n个人 * @param a int整型vector ai代表第i个人的高度 * @return long长整型 */ stack<int> s; long long solve(int n, vector<int>& a) { // write code here long long ans=0; for (int i=0; i<n; i++) { while (s.size()!=0 && a[s.top()]<=a[i]) s.pop(); if (s.size()!=0) ans+=(long long )s.top()+1; s.push(i); } return ans; } };