C++ STL算法(一)利用STL算法解决很常见的一些子问题

next_permutation

cplusplus:
next_permutation

作用:得到所有的全排列

例题:
P1706 全排列问题

void test1()
{
int n;
cin >> n;
int* arr = new int[n];
_rep(i, 0, n)
{
arr[i] = i + 1;
}
do {
_rep(i, 0, n)
{
printf("%5d", arr[i]);
}
cout << endl;
} while (next_permutation(arr, arr + n));
delete[] arr;
}

当然这样类似的题目也可以使用回溯法实现,回溯法是实现这类问题的主要方法。


lower_bound 与 upper_bound

lower_bound:得到大于等于这个数字的第一个元素。 否则(没有找到)返回尾后迭代器
upper_bound:得到大于这个数字的第一个元素。否则,返回尾后迭代器

这两个算法的实现就是运用了二分查找的思想,STL用于二分查找的函数:binary_search

这两个函数在查找找到元素第一个与最后一个元素的下标位置的题目中有奇效

例题:力扣 34. 在排序数组中查找元素的第一个和最后一个位置

class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res;
auto it1=lower_bound(nums.begin(),nums.end(),target);
if (it1==nums.end() || *it1!=target) return {-1,-1};
auto it2=lower_bound(nums.begin(),nums.end(),target+1)-1;
return {int(it1-nums.begin()),int(it2-nums.begin())};
}
};

这道题目也可以我们自己来实现二分查找的功能,具体实现可细节可以看我这篇博客:
二分查找的多种实现方式及本质解析(c++实现 + 例题)


partial_sum

partial_sum位于头文件numeric中。

作用: 用于求原数组的前缀和,并且保存于一个新的目标数组中。

前缀和是我们的一个重要的算法思想,使用这个函数,可以快速求某一个序列的前缀和。

函数接受一个原序列的头和尾,接受一个目标序列,最终目标序列的某一位存储的就是原序列到某一位为止的前缀和。

如下:

y0 = x0
y1 = x0 + x1
y2 = x0 + x1 + x2
y3 = x0 + x1 + x2 + x3
y4 = x0 + x1 + x2 + x3 + x4

实现:

//前缀和
void test2()
{
vector<int> src{ 1,2,3,4,5 };
vector<int> dst;
partial_sum(src.begin(), src.end(), back_inserter(dst));
_rep(i, 0, dst.size())
{
cout << dst[i] << " ";
}
}

在这里插入图片描述


sort 与 unique

sort:给一个序列排序
unique:对序列去重,注意这里的去重是指把重复多余的数字放在不重复的序列的后面而已,并不是真正的删除,使用erase来删除后面。返回排序后第一个多余的元素的位置。

例题:P1138 第 k 小整数

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
vector<int> arr(n);
for (int i=0;i<n;i++)
{
cin>>arr[i];
}
//排序
sort(arr.begin(),arr.end());
//去重,返回去重后的迭代器
auto it=unique(arr.begin(),arr.end());
int len=int(it-arr.begin());
if (len<k) cout<<"NO RESULT";
else cout<<arr[k-1];
return 0;
}
posted @   hugeYlh  阅读(22)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示