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来删除后面。返回排序后第一个多余的元素的位置。
#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; }
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17209643.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)