C++STL库 二分查找,以及对set集合进行二分查找,来源于”leetcode7022. 限制条件下元素之间的最小绝对差“
C++的头文件<algorithm>中有用于二分查找的函数,lower_bound()、upper_bound()以及binary_search():
lower_bound():返回大于等于目标值的第一个位置
upper_bound():返回大于目标值的第一个位置,
binary_search():若目标值存在则返回true,否则返回false
参数列表:(起始位置,结束位置,目标值)
STL库中的容器同样实现了二分查找函数,比如set、map有序容器均实现了上述lower_bound()、upper_bound()
在实际应用中容器的成员函数的查找效率比STL库中函数的查找效率高了几个数量级
例如在下面这个例子中,十万数据规模,分别调用STL库中的lower_bound()函数和set集合中的成员函数lower_bound()进行一万次二分查询,前者用时11s多,而后者只需要几毫秒。
以上来自今天力扣第 358 场周赛当中的第三题7022. 限制条件下元素之间的最小绝对差,使用窗口遍历+二分可以很方便的解决该问题,这也是一道完美应用数据结构的一道题。使用注释那条语句则会卡在用例2008/2013处
代码如下:
class Solution { public: int minAbsoluteDifference(vector<int> &nums, int x) { if (nums.size() == 1) return 0; int i = 0, j = x, ans = INT_MAX, n = nums.size(); set<int> st; for (; j < n; i++, j++) { st.insert(nums[i]); // auto it = lower_bound(st.begin(),st.end(),nums[j]); auto it = st.lower_bound(nums[j]); if (it == st.end()) { it--; ans = min(ans, abs(*it - nums[j])); } else if (it == st.begin()) { ans = min(ans, abs(*it - nums[j])); } else { ans = min(ans, abs(*it - nums[j])); it--; ans = min(ans, abs(*it - nums[j])); } } return ans; } };