Codility每周一课:P10.3 Peaks

0.png
P10.3 Peaks

Divide an array into the maximum number of same-sized blocks, each of which should contain an index P such that A[P - 1] < A[P] > A[P + 1].

  • P10.3 峰值
    将数组分为具有同样元素个数的块,每个块至少包括一个使得A[P - 1] < A[P] > A[P + 1]的峰值。

由N个整数组成的非空数组A。峰值是一个索引P, 其满足0 < P < N − 1, A[P − 1] < A[P]和A[P]>A[P+1]。

例如,数组A:
A[0] = 1,A[1] = 2,A[2] = 3,A[3] = 4,A[4] = 3,A[5] = 4,A[6] = 1,A[7] = 2,A[8] = 3,A[9] = 4,A[10] = 6,A[11] = 2
正好有三个峰值:3、5、10。

要将这个数组分成包含相同元素个数的块。更准确地说,我们要选择一个K数,它将产生以下块:
A[0], A[1], ..., A[K − 1];
A[K], A[K + 1], ..., A[2K − 1];
...
A[N − K], A[N − K + 1], ..., A[N − 1].

更重要的是,每个块至少应该包含一个峰值。请注意,块的两端的元素(例如A[K-1]、A[K]、A[N − K])也可以是峰值,但前提是它们都要有2个邻居(也可以是相邻块中的邻居)。
目标是找到数组A可以划分的最大块数。
示例中的数组A可以分为以下块:

  • 一块(1、2、3、4、3、4、1、2、3、4、6、2)。这个块有三个峰值。
  • 两块(1、2、3、4、3、4)和(1、2、3、4、6、2)。每个块都有一个峰值。
  • 三块(1、2、3、4)、(3、4、1、2)、(3、4、6、2)。每个块都有一个峰值。特别注意,第一个块(1、2、3、4)在[3]处有峰值,因为A[2]<A[3],并且A[3]>A[4],即使[4]在相邻区块中。

但是,数组A不能分为四个块(1、2、3)、(4、3、4)、(1、2、3)和(4、6、2),因为(1、2、3)块不包含峰值。请特别注意,(4,3,4)块包含两个峰值:A[3]和A[5]。因此数组A可分为块的最大数目为3。

编写函数:

def solution(A)

给定由N个整数组成的非空数组A,则返回可将A划分为块的最大数。如果A不能划分为若干块,则函数应返回0。
例如,针对上面的例子,函数应该返回3。

假定:

  1. N是区间[1,100000]内的整数;
  2. 数组A的每个元素都是区间[0,100000000]内的整数;
  • 解题思路
    首先得出数组A的峰值序列。因为要把数组A平均分成块,因此块数为数组A的因子。另外每个块都至少有一个峰值,因此因子数不能大于峰值数。如果要分为M个块,每个块中包括G个元素,则所有峰值除以G的余数,只要从0到M-1均有,则就能保证每个块中肯定至少包含一个峰值。
    Python3代码
# -*- coding:utf-8 -*-
# &Author  AnFany
# Lesson 10:Prime and composite numbers
# P 10.3 Peaks


def factor_no_one(N, p_count):
    """
    返回N的所有因子, 大于1,不大于P_count的因子序列
    :param N: 正整数N,大于等于2
    :param p_count: 峰值的个数
    :return: 返回N的所有不为1,并且不大于p_count的因子
    """
    factor_dict = {}
    for i in range(2, min(int(N ** 0.5), p_count) + 1):
        if N % i == 0 :
            if i not in factor_dict:
                factor_dict[i] = 0
            j = N / i
            if j == int(j) and int(j) not in factor_dict and j <= p_count:
                factor_dict[int(j)] = 0
    return list(factor_dict.keys()) + [N]


def solution(A):
    """
    将数组A切割成同等元素个数的块的最大个数,时间复杂度O(N * log(log(N)))
    :param A: 数组
    :return: 最大块数
    """
    peaks_list = []
    for index, value in enumerate(A):
        if index != 0:
            try:
                if value > A[index - 1] and value > A[index + 1]:
                    peaks_list.append(index)
            except IndexError:
                break
    length = len(peaks_list)  # 峰值的个数
    if length == 0:
        return 0
    elif length == 1:
        return 1
    else:
        length_a = len(A)  # 数组中所有元素的个数
        factor_list = factor_no_one(length_a, length)  # 元素个数的因子序列
        block_list = [1]  # 存储可能的块数
        for i in factor_list:
            #  每个块含有的元素的个数
            block_count = int(length_a / i)
            #  判断是否每个块都会有峰值
            blocks = [0] * i
            for j in peaks_list:
                blocks[j // block_count] = 1
            if 0 not in blocks:
                block_list.append(i)
        return max(block_list)
  • 结果
    image

点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。

image
image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,076评论 0 2
  • 夜黑渐淡, 清晨的第一束斜辉耀过天际。 送走那条悬挂的星河, 迎来的是又一个炎炎夏日。 阳光明亮灼热, 照在对面的...
    秋尾阅读 284评论 0 0
  • 今天的不高兴 和昨天的不高兴 大有区别 如果你昨天问我 为什么不高兴 我会滔滔不绝的跟你说上一天 而今天 你最好别问我
    别动zzz那是我的肉阅读 3,531评论 0 0
  • 中央电化教育馆幼儿园园长证 幼儿园园长资格证是园长上岗的唯一有效证书。目前,国家严把质量关要求所有园所园长必须做到...
    d9b241034f42阅读 272评论 0 0
  • 看着老人留下的字条我写下了“流浪的人不许掉眼 泪”这篇文章。我不知道那个风足残华的老人此刻到了哪座城市,只是,我知...
    一指流沙1阅读 264评论 2 1