程序员面试金典——番外篇之下一个较大元素II

程序员面试金典——番外篇之下一个较大元素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的最后一个元素的后一个元素。

你可能感兴趣的:(c/c++,程序员面试金典题目笔记)