📅  最后修改于: 2023-12-03 14:54:59.985000             🧑  作者: Mango
数组中的“领导者”是指在数组中,其右边所有元素都小于等于它的元素。这个问题可以通过遍历整个数组进行解决,但是时间复杂度为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)。同时,栈中的元素永远是单调递减的,因此栈中元素的单调性可以帮助我们快速找到领导者。