set/map最小值和最大值
// for std::set
// std::set<int> s;
auto min = *s.begin();
auto max = *s.rbegin();
// for std::map<int,string> s
auto minKey = s.begin()->first;
auto maxKey = s.rbegin()->first;
C++ set/map模拟最小堆,最大堆
用于求解 TopK Elements 问题,也就是 K 个最小元素的问题。可以维护一个大小为 K 的最小堆,最小堆中的元素就是最小元素。
最小堆需要使用小顶堆来实现,小顶堆表示堆顶元素是堆中最小元素。这是因为我们要得到 k 个最大的元素,因此当遍历到一个新的元素时,需要知道这个新元素是否比堆中最小的元素更大,更大的话就把堆中最大元素去除,并将新元素添加到堆中。所以我们需要很容易得到最小元素并移除最小元素,小顶堆就能很好满足这个要求。
堆也可以用于求解 Kth Element 问题,得到了大小为 k 的最小堆之后,因为使用了小顶堆来实现,因此堆顶元素就是第 k 大的元素。
(1)最小堆求第K大的值:
set<int, less<int>> s;
mulitset<int, less<int>> ms;
(2)最大堆求第K小的值:
set<int, greater<int>> s;
mulitset<int, greater<int>> ms;
示例:
vector<int> nums = {1,2,2,5,3,5};
//最小堆
set<int, less<int>> s1;
s1.insert(nums.begin(), nums.end());
printf("\n");
for (const auto & e : s1)
{
printf("->%d", e);
}
printf("\n");
//最大堆
set<int, greater<int>> s2;
s2.insert(nums.begin(), nums.end());
printf("\n");
for (const auto & e : s2)
{
printf("->%d", e);
}
printf("\n");
运行结果:
->1->2->3->5
->5->3->2->1
FAQ
Error:‘itoa’ was not declared in this scope
有些编译器不支持itoa,因为它不是标准的。
解决方法
c++11: std::to_string
sprintf
stdio.h
char *c = new char;
sprintf(c,"%d",num);
stringstream
sstream.h
stringstream ss; int x = 1;
ss << x;
string str = ss.str();
c++ string 末尾追加char字符
在string s末尾追加’a’:
s = s + 'a'; //这样写是可以的
s += 'a'; //这样写是不对的
c++ string倒序
string s("hello");
reverse(s.begin(), s.end());
关于lower_bound( )和upper_bound( )的常见用法
lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
在从小到大的排序数组中,
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。