首页 > 编程语言 >2024/1/13 算法笔记

2024/1/13 算法笔记

时间:2024-01-13 21:56:55浏览次数:30  
标签:nxt 13 int cnt mid 2024 索引 算法 head

1.二分查找的原则

  • 当要查找的值target>mid 就在mid和right中查找
  • 当要查找的值target<mid就在left和mid中查找

对于边界条件的处理:

while(l<r)

mid的取值是[l,r)

重点是下面部分,直接决定使用哪个二分模板。

1.3 中间值归属问题
这个问题其实比较灵活,这里我只讨论3种情况,其余情况类似。假设有序数组为int[] nums,求解的是索引,根据题目要求分为3种情况:

情况一
假设我们要搜索的是大于6的最小值索引,如果num[mid] <= 6,那么这个mid一定不是目标索引,此时left = mid + 1(因为mid位置的值比目标值还小,而我们找的元素肯定大于目标值),如果如果num[mid] > 6,此时的mid是有可能是目标索引的,所以令right = mid;
情况二
假设我们要搜索的是小于6的最大值索引,如果num[mid] >= 6,那么这个mid一定不是目标索引,此时right = mid - 1(因为mid位置的值比目标值还大,而我们找的元素肯定小于目标值),如果如果num[mid] < 6,此时的mid是有可能是目标索引的,所以令left = mid;
情况三(最简单)
假设我们要搜索的是等于6的索引,如果num[mid] > 6,那么这个mid一定不是目标索引,此时right = mid - 1;如果如果num[mid] < 6,此时的mid也肯定不是目标索引,所以令left = mid + 1;如果num[mid] == 6,那就找到啦;

情况一:

while(l<r){
    int mid = l+r >>1;
    if(check(mid)) r= mid; //往小收缩
    else l= mid+1;
}
cout<<l;

情况二、三:

while(l<r){
    int mid = l+r+1 >>1;
    if(check(mid)) l = mid;//往大扩张
    else r= mid-1;
}
cout<<l;

2.DAG图的拓扑排序

DAG图:有向无环图

简单的拓扑排序就是:找到任意一个入度为0的点,将它删除,和它相连的边也删除。这样反复做,如果最后的图能删光,不留点和边,则可以生成一个拓扑序列,否则不能生成。

具体实现是用queue存储入度为0的点,当处理一个queue中的点时,将它链接的点的入度分别-1,如果有相连的点的入度变成0了,就将这个点放入queue。最后queue为空时进行最终的判断。

扩展:DAG中找路径条数,长度不限制 场景:食物链计数

方法:伪dp

//拓扑排序板子
//邻接表方法:
int n,m;
int h[5000005],ru[5000005],chu[5000005],f[5000005];
int tot;
int ans;

struct node{
    int v,nxt;
}d[5000005];

queue<int>q;

void add(int u,int v){
    d[++tot].v = v;
    d[tot].nxt = h[u];
    h[u] = tot;
}

void tpsort(){
    for(int i=1;i<=n;i++){
        if(ru[i]==0){
            q.push(i);
            f[i]++;//入度为0即为最弱的一个点,所以f[i]=1;
        }
    }
    while(!q.empty()){
        int p = q.front();
        q.pop();
        for(int i=h[p];i;i=d[i].nxt){
            int to = d[i].v;
            f[to] = (f[to]+f[p])%mod;
            ru[to]--;
            if(ru[to]==0){
                q.push(to);//将入度为0的点作为起始点。
            }
        }
    }
}

void solve(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        add(a,b);
        ru[b]++;
        chu[a]++;
    }
    tpsort();

    for(int i=1;i<=n;i++){
        // debug(ans);
        if(chu[i]==0) ans = (ans+f[i])%mod;
    }
    cout<<ans<<endl;   
}

3.链式向前星

设置三个数组:

head[u] 表示以u作为起点的第一条边的编号

nxt[cnt] 表示以cnt为边的下一条边。这条边和cnt同起点。

to[cnt] 表示编号为cnt的边的终点。

初始时令head[u] = cnt =0;表示尚未有边,每个点都是孤立点。

当加入一条新边e[u,v]时,

  1. cnt++
  2. nxt[cnt] = head[u] ;将原来以u作为起点的第一条边,作为该边的后续边。
  3. to[cnt] = v; 当前边的终点位置
//不带权
void add(int u,int v)
{
    nxt[++cnt]=head[u];
    head[u]=cnt;
    to[cnt]=v;
}

//带权
void add(int u,int v,int w)
{
    nxt[++cnt]=head[u];
    head[u]=cnt;
    to[cnt]=v;
    val[cnt]=w;
}

//遍历
for(int i=head[u];!i;i=nxt[i])   //广度遍历
{
    int v=to[i];
    //其他操作
}

//删边   删去一条边【u,vv】
int last=0;
for(int i=head[u];!i;i=nxt[i])
{
    int v=to[i];
    if(v==vv)
    {
        if(i==head[u]) head[u]=nxt[i];
        else nxt[last]=nxt[i];
        break;
    }
    last=i;
}

标签:nxt,13,int,cnt,mid,2024,索引,算法,head
From: https://www.cnblogs.com/Akimizuss101/p/17963029

相关文章

  • 闲话1.13
    为啥没有模拟赛的日子这么无聊啊......
  • 1.13寒假每日总结4
    今天,主要尝试了在java中调用已有的python脚本并输出相关信息。 参考:百度文心一言的回复。 packagetest0113;importjava.io.*;publicclasstest{publicstaticvoidmain(String[]args){try{//指定Python解释器的路径......
  • Openharmony 跑 CV 算法
    最近有个项目,老同学让帮忙验证一个在ARM板上跑OpenHarmony,然后再集成一个CV算法上去,写这个文章主要是整理一下思路。如果有思路不对的地方,也烦请指出。1.个人做纯软件比较多,所以想着先不用板子,找个仿真环境,网上查了下,Qemu这个工具挺主流,那就先选它了,先跑起来这个(Ongoing)2.......
  • 每日总结2024/1/13(白盒技术)
    第一节:什么是白盒测试?白盒测试是软件测试技术,白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件程序验证。白盒测试中也称为透明盒测试、基于代码的测试和玻璃盒测试。它是BoxTesting软件测试方法之一......
  • .NET中的加密算法总结(自定义加密Helper类续)
    .NET中的加密算法总结(自定义加密Helper类续) 1.1.1摘要       相信许多人都使用过.NET提供的加密算法,而且在使用的过程我们必须了解每种加密算法的特点(对称或非对称,密钥长度和初始化向量等等)。我也看到过很多人写过.NET中加密算法总结,但我发现个别存在一些问题,很......
  • 2024-1-13 DAY4
    2024-1-13DAY4B-IntegralArray#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongusingnamespacestd;constintN=1e6+10;intn,c;voidsolve(){ cin>>n>>c; vector<int>cnt(c*2,0); for(i......
  • 算法练习题-系列一
    目录柯里化实现柯里化函数柯里化函数作用扁平化[双指针]有序数组合并判断一个字符串是否是回文字符串[字符串]两个版本号version1和version2[字符串]版本号大小比较排序['1.45.0','1.5','6','3.3.3.3.3.3.3']=>['1.5','1.45.0','3.3.3.3.3.3','6']给定两个......
  • 【教3妹学编程-算法题】构造限制重复的字符串
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥:3妹,什么事呀这么开森。3妹:2哥你看今天的天气多好啊,最近一周都是大晴天,艳阳高照2哥:是啊,天气不冷不热的,很适合生活3妹:据说南方的小土豆都跑到北方滑雪了,哈哈哈哈2哥:泼水成冰好玩是好玩,但是一定要注意防寒哦,看新闻都有......
  • 1月13日
    概念是学习的基础。在学习JS中的文件操作之前,先把文件相关的各种概念搞清楚,很有好处。 1.二进制:计算机硬件仅能处理和存储二进制数据,所以不管是你正在写的代码,还是你硬盘里的小姐姐,都是以二进制的形式存储于电脑的内存和硬盘里的。2.编码规则:二进制计算机看得懂,我们看不懂......
  • 算法学习Day26组合总和、分割回文串
    Day26组合总和、分割回文串ByHQWQF2024/01/13笔记39.组合总和给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集......