How to solve this HARD issue

1. Problem:

A non-empty zero-indexed array A consisting of N integers is given.

peak is an array element which is larger than its neighbours. More precisely, it is an index P such that 0 < P < N − 1 and A[P − 1] < A[P] > A[P + 1].

For example, the following array A:

    A[0] = 1
A[1] = 5
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

has exactly four peaks: elements 1, 3, 5 and 10.

You are going on a trip to a range of mountains whose relative heights are represented by array A, as shown in a figure below. You have to choose how many flags you should take with you. The goal is to set the maximum number of flags on the peaks, according to certain rules.

Flags can only be set on peaks. What's more, if you take K flags, then the distance between any two flags should be greater than or equal to K. The distance between indices P and Q is the absolute value |P − Q|.

For example, given the mountain range represented by array A, above, with N = 12, if you take:

  • two flags, you can set them on peaks 1 and 5;
  • three flags, you can set them on peaks 1, 5 and 10;
  • four flags, you can set only three flags, on peaks 1, 5 and 10.

You can therefore set a maximum of three flags in this case.

Write a function:

int solution(int A[], int N);

that, given a non-empty zero-indexed array A of N integers, returns the maximum number of flags that can be set on the peaks of the array.

For example, the following array A:

    A[0] = 1
A[1] = 5
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

the function should return 3, as explained above.

Assume that:

  • N is an integer within the range [1..200,000];
  • each element of array A is an integer within the range [0..1,000,000,000].

Complexity:

  • expected worst-case time complexity is O(N);
  • expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.

Copyright 2009–2015 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
 
2. Dig into this issue
    最初我认为这个问题非常复杂,需要牵涉到例如两点间最小距离啊,删除节点啊,对peak间的间距进行排序啊等等问题。
    不过在我看到时间复杂度要求为O(N)时,我觉得我还是想多了。
 
    通过数学我们可以得出,如果dis = 最后一个peak与第一个peak之间的距离,那么(k-1)*k<dis;
    于是我们就可以算出最大可能的k,而k与dis成√的关系,于是如果按照k的scale进行循环,那么我们就成功的减少了运算的时间复杂度。
 
    对于每一个k来说,最容易实现的方法肯定是从最左边的peak向右查找(因为如果从下一个开始,dis减少,k也会变少)。所以我们从最左边peak开始
   ,加上一个k,得到下一步,在这个点上寻找下一个peak,在依次向下搜索,直到找到的peak数等于k,完成,或者找不到下一个peak了(k过大),那么k-1,重复
   上层操作。
    
     这个操作在时间复杂度上还有一个技术障碍,就是在i位置寻找下一个peak需要O(N)级别的操作,我们如何将它变为O(1)级别的操作呢?
     用一个数组即可。
     我们首先遍历这个A,找出所有peak所在位置。然后定义一个数组nextpeak[],对于nextpeak[i],代表从i位置往后(包括i位置),所找到的第一个peak。
     通过O(N)的空间,我们就可以将找nextpeak的操作降为O(1)级别。
 
     这样通过我们上述的循环算法,总能找到k解。而且通过具体的验证,这个算法的时间复杂度是O(N)级别的。
 3.结果:
    
 
4.源代码为:

// you can write to stdout for debugging purposes, e.g.
// printf("this is a debug message\n"); int solution(int A[], int N) {
// write your code in C99
int i = ;
// 每一个节点是否为peak
int isPeak[N];
isPeak[]=;
isPeak[N-]=;
// peak个数
int count = ;
for(i=;i<N-;i++)
{
if(A[i]>A[i-]&&A[i]>A[i+])
{
isPeak[i]=;
count++;
}
else
{
isPeak[i]=;
}
}
//如果peak为0,那么直接退出没商量
if(count == )
{
return ;
}
//放入相应peak的位置。
int peak[count]; int j=;
for(i=;i<N;i++)
{
if(isPeak[i]==)
{
peak[j]=i;
j++;
}
} int dis = peak[count-]-peak[]; //最大可能k
int maxk =;
while((maxk-)*maxk<dis)
{
maxk++;
}
if((maxk-)*maxk!=dis)
maxk--; // 存入在i节点处下一个peak的位置,如果不存在下一个peak,为-1;
int nextpeak[N]; j=count-;
int temp = -;
for(i=N-;i>;i--)
{
if(i>peak[j])
{
nextpeak[i]=temp;
}
else
{
temp = peak[j];
j--;
nextpeak[i]=temp;
}
// printf("%d ",nextpeak[i]);
} //从 maxk,向下搜索,直到找出一个i(k)满足条件
int start = peak[];
int nodes = ;
for(i=maxk;i>;i--)
{
while(nodes<i)
{
start = start+i;
if(start > N-)
{
break;
}
start = nextpeak[start];
// printf("\n%d ",start);
if(start == -)
{
break;
}
else
{
nodes++;
}
}
if(nodes == i)
{
return i;
}
else
{
nodes = ;
start = peak[];
}
} return nodes;
}

codility flags solution的更多相关文章

  1. Codility NumberSolitaire Solution

    1.题目: A game for one player is played on a board consisting of N consecutive squares, numbered from ...

  2. Solution of NumberOfDiscIntersections by Codility

    question:https://codility.com/programmers/lessons/4 this question is seem like line intersections qu ...

  3. Solution to Triangle by Codility

    question: https://codility.com/programmers/lessons/4 we need two parts to prove our solution. on one ...

  4. the solution of CountNonDivisible by Codility

    question:https://codility.com/programmers/lessons/9 To solve this question , I get each element's di ...

  5. GenomicRangeQuery /codility/ preFix sums

    首先上题目: A DNA sequence can be represented as a string consisting of the letters A, C, G and T, which ...

  6. *[codility]Peaks

    https://codility.com/demo/take-sample-test/peaks http://blog.csdn.net/caopengcs/article/details/1749 ...

  7. *[codility]Country network

    https://codility.com/programmers/challenges/fluorum2014 http://www.51nod.com/onlineJudge/questionCod ...

  8. *[codility]AscendingPaths

    https://codility.com/programmers/challenges/magnesium2014 图形上的DP,先按照路径长度排序,然后依次遍历,状态是使用到当前路径为止的情况:每个 ...

  9. *[codility]MaxDoubleSliceSum

    https://codility.com/demo/take-sample-test/max_double_slice_sum 两个最大子段和相拼接,从前和从后都扫一遍.注意其中一段可以为0.还有最后 ...

随机推荐

  1. 【原】让H5页面适配移动设备全家 - 前端篇 - PPT

    7月份在部门内给设计中心的同事们带来<让H5页面适配移动设备全家 - 设计师篇 - PPT>的分享,在视觉和交互稿上提出页面适配的建议及提升页面体验的好处,促进前端和设计双方更好的合作,同 ...

  2. ACCELEROMETER

    顾名思义,是加速感应器.有2种应用吧:1,电脑保护,例如当笔记本掉落时,可以被自动检测到,此时会自动关闭硬盘操作以保护数据不在强烈冲击时丢失.

  3. 【repost】document.write的用处

    document.write的用处 document.write是JavaScript中对document.open所开启的文档流(document stream操作的API方法,它能够直接在文档流中 ...

  4. mysql max_allowed_packet 设置过小导致记录写入失败

    mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败. 查看目前配置 show VARIABLES ...

  5. [LeetCode] Same Tree 判断相同树

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  6. .NET WebAPI 用ActionFilterAttribute实现token令牌验证与对Action的权限控制

    项目背景是一个社区类的APP(求轻吐...),博主主要负责后台业务及接口.以前没玩过webAPI,但是领导要求必须用这个(具体原因鬼知道),只好硬着头皮上了. 最近刚做完权限这一块,分享出来给大家.欢 ...

  7. SQLite3源程序分析之虚拟机

    前言 最早的虚拟机可追溯到IBM的VM/370,到上个世纪90年代,在计算机程序设计语言领域又出现一件革命性的事情——Java语言的出现,它与c++最大的不同在于它必须在Java虚拟机上运行.Java ...

  8. HTTPf服务器(3)

    功能完整的HTTP服务器 导语 这个一个功能完备的HTTP服务器.它可以提供一个完整的文档输,包括图像,applet,HTML文件,文本文件.它与SingleFileHttpServer非常相似,只不 ...

  9. HTML中为何p标签内不可包含div标签?那哪些块元素里面不能放哪些块元素呢?

    先看下面的例子你就能明白两者的差别: <p>测试一下块元素与<span>内联元素</span>的差别</p> <p>测试一下<div& ...

  10. Jenkins + svn + maven 构建持续集成环境搭建

    Jenkins简介 Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: ...