演算法:最大值期望
阿新 • • 發佈:2020-12-22
題目描述
小強得到了長度為n的序列,但他只對非常大的數字感興趣,因此隨機選擇這個序列的一個連續子序列,並求這個序列的最大值,請告訴他這個最大值的期望是多少。
樣例 1:
輸入: [1, 2, 3]
輸出: 2.33
說明:
一共有六個子區間,分別是 [1], [2], [3], [1, 2], [2, 3], [1, 2, 3]
分別的最大值是 1, 2, 3, 2, 3, 3
每一個最大值出現的概率是1 / 6
,
所以最大值期望是 7 / 3
,
得到答案: 2.33
樣例 2:
輸入: [2, 3, 2]
輸出: 2.67
說明:
一共有六個子區間,分別是 : [2], [3], [2], [2, 3], [3, 2], [2, 3, 2]
分別的最大值是 :
2, 3, 2, 3, 3, 3
每一個最大值出現的概率是
1 / 6
,所以最大值期望是
8 / 3
,得到答案 :
2.67
解法分析
期望值為,每個可能的值 * 概率 之和。
這道題的解法可以分解為兩個部分,分母為n * (n + 1) / 2
.
分子為:
- 每個數字都相加入結果result,比如
[1,2,3]
; - 相鄰兩個數比較,大的累加入結果result,然後把大的數留下,比如
[2,3]
; - 重複第二步,知道只有一個數的時候
[3]
, 退出;
import java.util.Deque;
import java.util.LinkedList;
import java.util. List;
public class Idea1 {
public double expectMaximum(int[] nums) {
int len = nums.length;
long mon = (len + 1) / 2 * len;
long sum = 0;
Deque<Integer> deque = new LinkedList<Integer>();
for (int n: nums) {
sum += n;
deque.add(n);
}
while (!deque. isEmpty()) {
int size = deque.size();
for (int i = 0; i <= size - 2; i++) {
int pop = deque.pop();
int next = deque.getFirst();
int max = Math.max(pop, next);
sum += max;
deque.add(max);
if (i == size - 2) {
deque.pop();
}
}
if (size == 1) {
deque.pop();
}
}
double result = 1.0 * sum / mon;
return result;
}
public static void main(String[] args) {
Idea1 obj = new Idea1();
//int[] nums1 = new int[]{1, 2, 3};
int[] nums1 = new int[]{2, 3, 2};
double result = obj.expectMaximum(nums1);
System.out.println(result);
}
}
以上為筆者給出的結果,題目的測試用例通過。
不過最終沒有過題目:請檢查你的程式碼和演算法正確性,WA通常是由錯誤的答案造成的,請思考一下你的演算法是否正確。
如知道問題所在,還請讀者留言指正。謝謝
題目
https://tianchi.aliyun.com/oj/186516216680835547/224416081208611634
所有參賽題目:https://tianchi.aliyun.com/oj/186516216680835547