业务需求是这样的:求某项数据的榜首时间以及最长榜首时间。
榜首时间:从开始计算指标数据的排名开始到今天排名为1的天数。
最长榜首时间:从开始计算指标数据的排名到今天排名持续为1的天数。
思路和解决方案:
1.首先查询出来截至到今天某指标这几天的排名变化,有可能为如下类型数据。
1 2 1 0 4 5 3 5 2 ......
榜首时间:
/**
* 榜首时间
* @param days
* @return
*/
public long firstStr(int[] days){
return Arrays.stream(days)
.filter(ns -> Objects.nonNull(days) && ns == 1)
.count();
}
最长榜首时间(贪心算法):
/**
* 贪心算法解决问题
* @param arr
* @return
*/
public int longestStr(int[] arr) {
int start = 0;
int max = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 1) {
start++;
} else {
start = 0;
}
max = Math.max(max, start);
}
return max;
}
为什么用贪心算法?
因为最长榜首时间可以通过局部最优解求出来全局最优解。