枪打出头鸟

题解

解法一:
对于每个人,都暴力遍历,找到在我之前比我高的第一个人,计算答案。
时间复杂度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;
    }
};
全部评论

相关推荐

拉丁是我干掉的:把上海理工大学改成北京理工大学。成功率增加200%
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务