Leetcode题库 798.得分最高的最小轮调(差分数组 C实现)

本文探讨了两种算法:双层循环方法,其时间复杂度为O(n^2),空间复杂度为O(n),通过不断旋转数组寻找正数最多的子序列;另一种是差分数组优化,时间复杂度降为O(n),空间复杂度同样为O(n),利用差分数组简化计算过程。两种方法对比,适合不同场景下的数组优化问题解决。
摘要由CSDN通过智能技术生成

算法一 双层循环

时间复杂度:n^2
空间复杂度:n

int bestRotation(int* nums, int numsSize){
    char Differ_L[numsSize];
    int Temp;//临时存储首位
    int Temp_Score;//临时分数
    int Index;//当前最优k
    int Score;//当前最优k对应的分数
    
    //Differ_L初始化
    Index=0;
    Score=0;
    for(int i=0;i<numsSize;i++){
        nums[i]=i-nums[i];
        if(nums[i]>=0) Score++;
    }

    //迭代开始
    for(int i=1;i<numsSize;i++){
        Temp_Score=0;
        Temp=nums[0];

        //前numsSize-1数据计算
        for(int j=0;j<numsSize-1;j++){
            nums[j]=nums[j+1]-1;
            if(nums[j]>=0) Temp_Score++;
        }
        
        //第numsSize数据计算
        nums[numsSize-1]=Temp+numsSize-1;
        if(nums[numsSize-1]>=0) Temp_Score++;
        
        //最优判定
        if(Temp_Score>Score){
            Index=i;
            Score=Temp_Score;
        }
    return Index;

}

算法二 差分数组

时间复杂度:n
空间复杂度:n

int bestRotation(int* nums, int numsSize){
    int ret=0;
    
    //差分数组初始化
    int Differ[numsSize];
    for(int i=0;i<numsSize;i++){
        Differ[i]=0;
    }

    //差分数组计算
    for(int i=0;i<numsSize;i++){
        if(i>=nums[i]){
            Differ[0]++;
            if(i-nums[i]+1<numsSize) Differ[i-nums[i]+1]--;
            if(i+1<numsSize) Differ[i+1]++;
        }
        else{
            Differ[i+1]++;
            if(numsSize-nums[i]+i+1<numsSize) Differ[numsSize-nums[i]+i+1]--;
        }
    }

    //前缀和
    for(int i=1;i<numsSize;i++){
        Differ[i]+=Differ[i-1];
        if(Differ[i]>Differ[ret]) ret=i;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值