【算法集训暑期刷题营】7.2日题---二分

算法集训传送门

  👉引言

在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

💖 ❄️我们的算法之路❄️💖

   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
              ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
   💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

在这里插入图片描述


今日主题:二分


 👉⭐️第一题💎

   ✨题目

在这里插入图片描述

      1.二分查找

   ✨思路

直接使用STl中的二分查找函数,这里是找到大于等于target的数并返回迭代器,所以还要判断找到的数是不是严格等于target的

   ✨代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
	int i=lower_bound(nums.begin(), nums.end(), target)-nums.begin();
	if (i == nums.size())return -1;
	return nums[i] == target ? i : -1;
}
};

在这里插入图片描述

 👉⭐️第二题💎

   ✨题目

      2.找出数组排序后的目标下标
在这里插入图片描述

同样使用STL中的二分查找函数,找到等于target的数的个数,然后找到初始下标,随后每项+1并放入ans中,表示目标下标

   ✨代码
class Solution {
public:
 vector<int> targetIndices(vector<int>& nums, int target) {
	vector<int>ans;
	sort(nums.begin(), nums.end());
    int i = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
	int n = (upper_bound(nums.begin(), nums.end(), target) - nums.begin())-i ;
	if (n <= 0)return ans;
	ans.resize(n);
	for (int t = 0; t < n; t++) {
		ans[t] = i++;
	}
	return ans;
}
};

在这里插入图片描述

 👉⭐️第三题💎

   ✨题目

      3.寻找重复数
在这里插入图片描述

   ✨思路

用一个map解决

   ✨代码
class Solution {
public:
   int findDuplicate(vector<int>& nums) {
	map<int, int>ans;
	for (int i = 0; i < nums.size(); i++) {
		ans[nums[i]]++;
		if (ans[nums[i]] != 1)return nums[i];
	}
	return -1;
}
};

在这里插入图片描述

 👉⭐️第四题💎

   ✨题目

      4.Binary Deque
在这里插入图片描述

   ✨翻译

在这里插入图片描述

   ✨代码
#include "bits/stdc++.h"
using namespace std;
 
#define ll long long
 
#define       forn(i,n)              for(int i=0;i<n;i++)
#define          all(v)              v.begin(), v.end()
#define         rall(v)              v.rbegin(),v.rend()
 
#define            pb                push_back
#define          sz(a)               (int)a.size()


ll query(int l, int r, vector<ll>& p) {
    return p[r] - (l ? p[l - 1] : 0);
}

void solve() {  
    int n, s; cin >> n >> s;
    vector<ll> a(n), p(n);
    forn(i, n) {
        cin >> a[i];
        p[i] = a[i];
        if(i) p[i] += p[i - 1];
    }

    int ans = INT_MAX;

    for(int i = 0; i < n; ++i) {
        int l = i, r = n - 1, pos = -1;
        while(l <= r) {
            int mid = l + r >> 1;
            if(query(i, mid, p) <= s) {
                pos = mid;
                l = mid + 1;
            } else r = mid - 1;
        }
        if(pos == -1 || query(i, pos, p) != s) continue;
        ans = min(ans, n - (pos - i + 1));
    }

    cout << (ans == INT_MAX ? -1 : ans) << "\n";
} 
     
int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
}   在这里插入代码片

写在最后
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦想new的出来

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

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

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

打赏作者

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

抵扣说明:

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

余额充值