📜  数组中领导者的 C++ 程序(1)

📅  最后修改于: 2023-12-03 14:54:59.985000             🧑  作者: Mango

数组中领导者的 C++ 程序介绍

简介

数组中的“领导者”是指在数组中,其右边所有元素都小于等于它的元素。这个问题可以通过遍历整个数组进行解决,但是时间复杂度为O(n^2),而使用栈可以达到时间复杂度O(n)。

解决方法
方法一:遍历整个数组

遍历整个数组,对于每一个元素,检查其右边元素是否都小于等于它。时间复杂度为O(n^2)。

vector<int> findLeaders(vector<int>& nums) {
    vector<int> res;
    int n = nums.size();
    for (int i = 0; i < n; i++) {
        bool flag = true;
        for (int j = i + 1; j < n; j++) {
            if (nums[j] > nums[i]) {
                flag = false;
                break;
            }
        }
        if (flag) res.push_back(nums[i]);
    }
    return res;
}
方法二:使用栈

使用栈,在遍历数组时将元素压入栈中,并比较栈顶元素和当前元素的大小关系。如果当前元素大于栈顶元素,说明栈顶元素不是领导者,则将栈顶元素弹出;反之,则将当前元素压入栈中。由于栈中的元素永远是单调递减的,因此领导者就是弹出后栈顶元素。时间复杂度为O(n)。

vector<int> findLeaders(vector<int>& nums) {
    vector<int> res;
    stack<int> st;
    int n = nums.size();
    for (int i = n - 1; i >= 0; i--) {
        if (st.empty() || nums[i] > st.top()) {
            res.push_back(nums[i]);
            st.push(nums[i]);
        }
    }
    return res;
}
总结

使用栈比遍历整个数组更加高效,可以将时间复杂度从O(n^2)降低到O(n)。同时,栈中的元素永远是单调递减的,因此栈中元素的单调性可以帮助我们快速找到领导者。