查找数组中非递减和非递增子序列的数量

时间:2015-11-04 23:18:51

标签: algorithm

我正在尝试从HackerRank上的Quora完成编程挑战:https://www.hackerrank.com/contests/quora-haqathon/challenges/upvotes

我设计了一个适用于某些测试用例的解决方案,但是,对于许多我使用的算法都不正确。

我不是寻求解决方案,而是简单地要求解释如何创建子序列,然后我自己实现解决方案。

例如,输入:

6 6

5 5 4 1 8 7

正确的输出是-5,但我没有看到-5是答案。子序列将是[5 5 4 1 8 7],我不能在我的生活中找到一种方法来获得-5作为输出。

  

问题陈述

     

在Quora,我们有汇总图表来跟踪我们每天获得的赞成票数量。

     

当我们查看某些大小的窗口的模式时,我们考虑了尽可能有效地跟踪非减少和不增加子范围等趋势的方法。

     

针对此问题,您将获得N天的upvote计数数据和固定的窗口大小K.对于K天的每个窗口,从左到右,查找窗口内非减少子范围的数量减去数量窗口内不增加的子范围。

     

天数窗口被定义为连续的天数范围。因此,确实存在需要计算该度量的N-K + 1个窗口。非递减子范围被定义为索引[a,b],a<b的连续范围,其中每个元素至少与前一个元素一样大。类似地定义了非增加子范围,除了每个元素至少与下一个元素一样大。窗口内的这些相应子范围最多为K(K-1)/ 2,因此度量以[-K(K-1)/ 2,K(K-1)/ 2]为界。

     

约束

     

1≤N≤100,000天   1≤K≤N天

     

输入格式

     

第1行:两个整数,N和K
  第2行:upvote计数的N个正整数,每个整数小于或等于10 ^ 9

     

输出格式

     

第1行..:N-K + 1个整数,每个窗口的一个整数在每行上得到结果

     

示例输入

     

5 3

     

1 2 3 1 1

     

示例输出

     

3

     

0

     

-2

     

解释

     

对于[1,2,3]的第一个窗口,有3个非递减子范围,0个不递增,所以答案是3.对于[2,3,1]的第二个窗口,有1个非递减子范围和1个非递增,因此答案为0.对于[3,1,1]的第三个窗口,有1个非递减子范围和3个非递增子系数,因此答案为-2。

1 个答案:

答案 0 :(得分:7)

给定窗口大小为6,序列

5 5 4 1 8 7

非递减子序列

5 5
1 8

和非增加的子序列是

5 5
5 4
4 1
8 7
5 5 4
5 4 1
5 5 4 1

对于非递减子序列,+2-7,对于非递增子序列,-5为{{1}}作为最终答案。