基础算法思路整理

本文整理了基础算法的学习思路,包括快速排序、归并排序、整数二分、高精度运算、前缀和、差分、离散化和区间合并等。详细介绍了各种算法的中心思想、注意事项和模板,适合算法初学者参考。
摘要由CSDN通过智能技术生成

基础算法学习思路整理

二刷yxc的基础课,这是一些总结心得.
(注:以下题目全部来自于Acwing)

快速排序

思路:
中心思想:双指针从数据范围两端进入,比较与中点mid的关系(找点找中点,减小时间复杂度,随机找点容易超时),在数据范围内,左端找到比mid大的数,右端找到比mid小的数,交换,在数据范围内循环进行.

注意:
1.递归数据结束条件L>=R
2.先对整段数据操作,再递归分段(区别于归并排序)
时间复杂度O(nlogn)
模板

#include<iostream>
using namespace std;
const int N=1e5+5;
void quicksort(int l,int r,int a[]){
   
    if(l>=r)return;
    
    int i=l-1,j=r+1;
    int mid=a[l+r>>1];
    while(i<j){
   
        do i++;while(a[i]<mid);
        do j--;while(a[j]>mid);
        if(i<j)swap(a[i],a[j]);
    }
    quicksort(l,j,a);
    quicksort(j+1,r,a);
}
int main(){
   
int n,a[N];
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
quicksort(1,n,a);
for(int i=1;i<=n;i++)cout<<a[i]<<' ';
    return 0;
}

.
.
.

归并排序

思路:
中心思想:设置暂存数组,将数据分为两段,双指针移动比较,谁小谁放入数组,最后将暂存数组copy回原数组.

注意:
1.当其中一个指针移动到尾端退出循环后,将另一序列的剩下的数全部放入暂存数组.
2.先分段,再递归排序(区别于快速排序)
时间复杂度O(nlogn)
模板

#include<iostream>
using namespace std;
const int N=100010;
int temp[N];
void mergesort(int l,int r,int a[]){
   
    if(l>=r)return;
    int mid=l+r>>1;
    mergesort(l,mid,a);
    mergesort(mid+1,r,a);
    int i=l,j=mid+1,idx=0;
    while(i<=mid&&j<=r){
   
        if(a[i]<a[j])temp[idx++]=a[i++];
        else temp[idx++]=a[j++];
    }
    while(i<=mid)temp[idx++]=a[i++];
    while(j<=r)temp[idx++]=a[j++];
    for(i=l,j=0;i<=r;i++,j++)a[i]=temp[j];
    }
int main(){
   
    int a[N],n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    mergesort(1,n,a);
    for(int i=1;i<=n;i++)cout<<a[i]<<' ';
    return 0;
}

.
.
.

整数二分

当数据范围太大时,可以运用二分减少时间复杂度,快速找到数据位置.
思路:
中心思想:设置中点,不断检验数据是否满足条件,然后改变左右边界,重新找到中点,继续检验,直到满足条件结束,找到需要的位置

注意:
1.当判断不满足某个性质为条件时,中点设置为mid=(l+r+1)>>1;而判断满足某个性质为条件时,中点设置为mid=l+r>>1.

时间复杂度O(logn)
模板题
给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。
对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。
如果数组中不存在该元素,则返回“-1 -1”。

输入格式
第一行包含整数n和q,表示数组长度和询问个数。
第二行包含n个整数(均在1~10000范围内),表示完整数组。
接下来q行,每行包含一个整数k,表示一个询问元素。

输出格式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值