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

简介: 【算法集训 | 暑期刷题营】7.22日题---二分

 👉引言


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


我们的算法之路


   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨

     ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️

   💝 二分,💝 贪心,💝 并查集,💝 二叉树,💝 图论,💝 深度优先搜索(dfs),💝 宽度优先搜索(bfs),💝 数论,💝 动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉

image.png


今日主题:二分


 👉🌟 第一题🌟


   💎题目


image.png


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

image.png


 👉🌟第二题💎


   👉题目


      2.找出数组排序后的目标下标image.png

同样使用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;
}
};

image.png


 👉🌟第三题💎


   👉题目


     3.寻找重复数

image.png


   👉思路:


用一个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;
}
};

image.png


 👉🌟第四题💎


   👉题目


      4.Binary Dequeimage.png


   👉:翻译:


image.png


   👉代码:


#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();
    }
}   在这里插入代码片

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


相关文章
|
6月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
2月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
22 0
|
4月前
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
|
4月前
|
算法 Python
【Leetcode刷题Python】改进的算法,高效求一个数的因子
一个高效的Python函数用于找出一个整数的所有因子,通过仅遍历到该数平方根的范围来优化性能。
50 0
|
6月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
6月前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
6月前
|
算法
【数据结构与算法 刷题系列】判断链表是否有环(图文详解)
【数据结构与算法 刷题系列】判断链表是否有环(图文详解)
|
6月前
|
算法
【数据结构与算法 刷题系列】移除链表元素
【数据结构与算法 刷题系列】移除链表元素
|
6月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
|
6月前
|
算法 C语言
【数据结构与算法 刷题系列】求链表的中间结点
【数据结构与算法 刷题系列】求链表的中间结点