1. 程式人生 > 其它 >演算法:最大值期望

演算法:最大值期望

技術標籤:演算法leetcode最大值期望

題目描述

小強得到了長度為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.
分子為:

  1. 每個數字都相加入結果result,比如[1,2,3];
  2. 相鄰兩個數比較,大的累加入結果result,然後把大的數留下,比如[2,3];
  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