程序员面试金典——番外篇之下一个较大元素II
Solution1:我的答案,时间复杂度为 O(n2) O ( n 2 )
垃圾算法
class NextElement {
public:
vector<int> findNext(vector<int> A, int n) {
// write code here
vector<int> res;
for (int i = 0; i < A.size() - 1; i++) {
int temp = find_bigger(i, A);
res.push_back(temp);
}
res.push_back(-1);
return res;
}
int find_bigger(int seq, vector<int> &nums) {
int res = INT_MAX;
for (int i = seq + 1; i < nums.size(); i++) {
if(nums[i] > nums[seq])
res = min(res, nums[i]);
}
if(res == INT_MAX)
res = -1;
return res;
}
};
Solution2:
参考网址:https://www.nowcoder.com/profile/4392165/codeBookDetail?submissionId=12516985
使用set,时间复杂度为
O(nlogn)
O
(
n
l
o
g
n
)
class NextElement {
public:
vector<int> findNext(vector<int> A, int n) {
// write code here
set<int> ss;
vector<int> result;
for (int i = n - 1; i >= 0; -- i) {
auto pos = ss.lower_bound(A[i]);
if (pos != ss.end() && *pos == A[i])
++ pos;
if (pos == ss.end()) {
result.push_back(-1);
}
else {
result.push_back(*pos);
}
ss.insert(A[i]);
}
reverse(result.begin(), result.end());
return result;
}
};
upper_bound 和lower_bound 的返回值问题
这俩函数用的确实少,要注意用法!!!
参考网址:https://blog.csdn.net/naipp/article/details/52915573
upper_bound 和lower_bound是二分查找,所以效率略高,但笔者在使用的时候发现偶尔会有一些问题,所以写了这篇文章,总结了一发。
首先,最形象的一句话:
upper_bound(i)返回的是键值为i的元素可以插入的最后一个位置(上界)
lower_bound(i)返回的是键值为i的元素可以插入的位置的第一个位置(下界)。
怎么理解呢,举例:
在升序的set里面
1.set里没有元素i的时候,两个元素的返回值是一样的。
1 2 4 5 这个序列,upper(3)和lower(3)都返回位置2(下标)
2.如果只有一个元素i,low返回那个元素的位置,而upp返回那个元素的位置的后一个位置。
1 2 4 5 这个序列upp(2)返回下标2而low(2)返回下标1
3.多个元素i,low返回第一个元素的位置,upp返回那多个元素中的最后一个的后一个位置。
1 2 2 4 5 这个序列 upp(2)返回下标3的位置,low(2)返回下标1的位置。
!!!!!!!!!!!!!
特别注意:举例在一个升序的容器里,如果所有元素都大于i则,upp和low都返回begin。都小于i则返回end(越界了)。
最后再来一句,看是否好理解一些。
terator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值<=key的最后一个元素的后一个元素。
★降序排列的容器:
iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值<= key的第一个元素。
iterator upper_bound( const key_type &key ):返回一个迭代器,指向键值>=key的最后一个元素的后一个元素。