信奥赛算法

头文件

#include < algorithm > 调用标准算法库

算法

  解决问题的策略机制

五大特征

    有穷性 :
       必须能在执行有限个步骤之后终止
    确切性:
       每一步骤必须有确切的定义
    输入项:
       有0个或多个输入
    输出项:
       有一个或多个输出
    可行性 / 有效性:
       每个计算步骤都可以在有限时间内完成

算法复杂度

时间复杂度

  算法的运行时间
  时间频度是指语句执行的次数,也叫语句频度。它计算时间复杂度的一种方法。

for(int i=1;i<=n;i++)
	cout<<"Hello";

循环体执行n次,则时间频度记为O(n)

算法时间复杂:
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)(立方阶) <O(2^n) (指数阶)

空间复杂度

  算法所耗费的存储空间
  算法所占存储空间:
    本身所占的空间
    运行过程中临时占用的空间

模拟和枚举算法

模拟算法

  按照题目所述的方式来写,最终运行得出想要的结果

枚举算法

  列举出所有可能的解,并逐一检验可行性

二分查找

  二分查找也称折半查找,是一种效率较高的查找方法。
  数组必须是升序序列

查找 x

二分查找与顺序查找的演示图对比:
在这里插入图片描述
  时间复杂度
    一般情况:O( logn )
    最好情况下只需要进行1次比较就能找到目标元素:O( 1 )

int x;
cin>>x;
int mid,l=1,r=n;
while(l<=r){
	mid=(l+r)/2;
	if(a[mid]==x){
		ans=mid;
		break;
	}else if(a[mid]>x){
		r=mid-1;
	}else{
		l=mid+1;
	}
}
cout<<ans;

递归写法

int solve(int l,int r,int x){
	int mid=l+(r-l)/2;
	if(a[mid]==x) return mid;
	else if(a[mid]<x) return solve(mid,r,x);
	else if(a[mid]>x) return solve(l,mid,x);
}

查找第一个大于等于x的数

  在一个有序的序列中查找第一个大于等于 x 的数 ( 数列中有重复的数字 )

int x;
cin>>x;
int mid,l=1,r=n,pos=-1;
while(l<=r){
	mid=(l+r)/2;
	if(a[mid]>=x){
		pos=mid;
		r=mid-1;
	}else {
		l=mid+1;
	}
}	
cout<<pos;

查找第一个大于x的数

  在一个有序的序列中查找第一个大于 x 的数 ( 数列中有重复的数字 )

int x;
cin>>x;
int mid,l=1,r=n,pos=-1;
while(l<=r){
	mid=(l+r)/2;
	if(a[mid]>x){
		pos=mid;
		r=mid-1;
	}else {
		l=mid+1;
	}
}	
cout<<pos;

lower_bound 和 upper_bound 函数

  lower / upper_bound(a+第一个下标,a+最后一个下标+1,查找元素名) - a
  lower_bound(a+1, a+n+1, x) - a
  lower_bound()函数返回数组 a 中大于等于 x 的第一个元素的地址
  upper_bound(a+1, a+n+1, x) - a
  upper_bound()函数返回数组 a 中大于 x 的第一个元素的地址

  找不到元素则返回n+1

二分答案

  答案有一个区间,在这个区间中二分,直到找到最优答案
是否用二分答案解题:

答案在一个区间内
直接搜索不好搜,但是容易判断一个答案可行不可行
该区间对题目具有单调性,即:在区间中的值越大或越小,题目中的某个量对应增加或减少。

递归

  函数不断调用自身,直到调用的对象已知
  递归两大要素:
     1. 调用自身函数
     2. 停止递归条件

递推

  顺推:从已知的初始条件出发,逐步推出要解决的问题
  逆推:从问题出发逐步推到已知条件

前缀和

  前缀和是数组的前n项和
在这里插入图片描述

原理

sum[r] = a[1] + a[2] + a[3] + a[l-1] + a[l] + a[l + 1] … a[r];
sum[l - 1] = a[1] + a[2] + a[3] + a[l - 1];
sum[r] - sum[l - 1] = a[l]+ a[l + 1] + …+ a[r];

差分

  差分是一种用于对数组的某一区间进行计算操作的算法在这里插入图片描述

原理

b[ i ] = a[ i ]- a[ i - 1];

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值