中国大学MOOC-陈越、何钦铭-数据结构-习题解答-01 复杂度

文章目录

        • 1. 01-复杂度1 最大子列和问题 (20 分)
          • 【题目链接】
          • 【解答】
        • 2. 01-复杂度2 Maximum Subsequence Sum (25 分)
          • 【题目链接】
          • 【解答】
        • 3. 01-复杂度3 二分查找 (20 分)
          • 【题目链接】
          • 【解答】

1. 01-复杂度1 最大子列和问题 (20 分)

【题目链接】

题目描述

【解答】

在线处理算法是解这个题目的最快算法(O(n)),具体如下:

#include 
int main(void)
{
    int n,num;
    scanf("%d",&n);
    int i,this_sum,max_sum;
    this_sum=max_sum=i=0;
    while (i<n) {
        scanf("%d",&num);
        this_sum+=num;
        if (this_sum>max_sum)
            max_sum=this_sum;
        else if (this_sum<0)
            this_sum=0;
        i++;
    }
    printf("%d",max_sum);
    
    return 0;
}

2. 01-复杂度2 Maximum Subsequence Sum (25 分)

【题目链接】

题目描述

【解答】

这个题是上一个题目的进阶版,不仅要求出最大子列和,还要给出最大子列的头尾元素,此外还需要注意全是负数的情况和全是负数与0的情况,具体代码如下:

#include 
#include                 //用到了bool类型,需要包含此头文件
int main(void)
{
    int n;
    scanf("%d",&n);                 //待处理的数据规模
    int a[n];
    int i,this_sum,max_sum,start,start1,end,index0;
    bool all_negtive,first_zero,exist_zero;     //处理全是负数或者全是负数和0的特殊情况
    this_sum=max_sum=0;             //初始化当前子列和与最大子列和
    start=start1=end=0;             //初始化最大子列和首尾元素的下标
    all_negtive=first_zero=true;   
    exist_zero=false;
    for (i=0;i<n;i++) {
        scanf("%d",&a[i]);
        if (a[i]>0)                //出现>0的元素则不是特殊情况
            all_negtive=false;
        else if (a[i]==0)          //全是负数和0
            if (first_zero) {
                index0=i;          //只记录第一个0的位置
                first_zero=false;
                exist_zero=true;
            }
        this_sum+=a[i];            //程序主体部分开始
        if (this_sum>max_sum) {
            max_sum=this_sum;
            end=i;
            start=start1;          //如果最大子列和发生更新,将start所记录的首元素更新为当前子列(start1)的首元素位置
        }
        else if (this_sum<0) {     //如果当前子列和重置为0,则开启一个新子列,start1记录新子列的首元素位置
            this_sum=0;
            start1=i+1;
        }
    }
    if(all_negtive) {              //没有正数
        if (exist_zero)            //全是负数和0
            start=end=index0;
        else                       //全是负数
            end=n-1;
    }
    printf("%d ",max_sum);         //输出结果
    printf("%d %d\n",a[start],a[end]);
    
    return 0;
}

3. 01-复杂度3 二分查找 (20 分)

【题目链接】

题目描述

【解答】

二分查找题目比较简单,注意中点和移位的细节即可,本题是函数题,传入一个结构体和待查找的元素,返回元素位置(数组下标)。

Position BinarySearch( List L, ElementType X )
{
    Position p,a,b,mid;
    p=NotFound,a=1,b=L->Last;
    while (a<=b) {
        mid=(a+b)/2;
        if (L->Data[mid]==X) {
            p=mid;
            break;
        } else if (L->Data[mid]<X) {
            a=mid+1;
        } else 
            b=mid-1;
    }
    
    return p;
}

你可能感兴趣的:(笔记)