第四章实践

  1. 实践题目
  2. 问题描述
  3. 算法描述
  4. 算法时间及空间复杂度分析(要有分析过程)
  5. 心得体会(对本次实践收获及疑惑进行总结)

 

 

 

1.

删数问题

 

2.

给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

 

3.

贪心算法策略是每次删除一个数字,都要保证删除后这个数是当前最小的,就是说如果要删除4个数字,就是把问题分为4个,每一个就是当前的数删一个数字后变成最小的数,而方法就是较大的数位删掉, 从第一位数开始检索,找到一个数比它后面的数大,就把这个数删掉,如果整个数是按升序的,就从后面开始删。核心算法如下:

    for(int i=1;i<=s;++i)

    {

        for(int j=0;j<len-1;j++)

            if(n[j]>n[j+1])

            {

                for(int k=j;k<len-1;++k)

                n[k]=n[k+1];

                break;

            }

        len--;

    }

查找比后面的数大的数并删掉,都符合的话就从后面删起。

 

4.

空间复杂度显而易见就是一位数组,即O(n)

时间复杂度,因为有两个循环,就是O(s*len-1)就是平方的复杂度,表示为O(n^2)

 

5.

    这次最大的体会就是,贪心算法一定理解透彻,策略不能错,一开始做的时候我先把数字降序排序,每次删掉最大的一个,但是却忽略一个很重要的问题,比如12354删掉一个数变最小,的确是删掉最大的5,但是如果是123546,这时候就不是删掉最大的6了,而是删掉5,因为这个数是一个整体,我当时就没考虑到数位的问题,所以策略应该是每次删掉那个不符合非降序的那个数,删到整个数都是非降序为止,然后如果还要删除的话,就删后面几个数。

posted @ 2018-11-29 23:04  荷里活DJ  阅读(123)  评论(0)    收藏  举报