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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuleo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值