786. 第k个数 自刷 快排加前缀和解法(DAY 50)

原题题目

在这里插入图片描述
一看这个题,哦,原来是快排,但是似乎还要加一点东西,快排只能排序,咱们还要输出特定的数字,所以想到前缀和,这个三似乎就是排序后,s[i]-s[i-1]的解法!

代码实现

 #include<iostream>
using namespace std;
const int N=1000010;
int n,m;
int q[N],s[N];

void quick_sort(int q[],int l,int r)
{
    if(l>=r)return;
    int x=q[l+r>>1],i=l-1,j=r+1;
    while(i<j)
    {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j)swap(q[i],q[j]);
    }
    quick_sort(q,l,j);
    quick_sort(q,j+1,r);
}

int main()
{
    cin>> n>> m;
    for(int i=0;i<n;i++)cin>> q[i];//初始化数组,读入数字
    quick_sort(q,0,n-1);
    for(int i=0;i<n;i++)s[i]=s[i-1]+q[i];//前缀和
    
    int res=0;
    
        res=s[m-1]-s[m-2];    //前缀和去掉循环,即去掉了m次询问,直接求第一个即可。
    
    cout <<res;
    return 0;
}

在这里插入图片描述
前缀和无非是加了一个m次询问,输出了很多组数组,咱们把他去掉,诶,就出现个新用法!
看来唯有多学习,多练习才是王道,时间花在这上面就对喽!

思路总结

多看算法,记牢才能活用,用多了思路就打开了。好比把基础模板学会,再融会贯通,原本属于快排的题,快排+前缀和也能做出来,能做就是好算法。加自己理解的才是自己的!加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张学恒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值