[Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]
【問題描述】[簡單]
【解答思路】
邊界問題
思路
一般情況,k塊木板,k種可能
跳水板的長度是 shorter(k-j)+longer*j,其中 0 ≤ i < j ≤ k,且為升序排列
1. 數(shù)學(xué)
時間復(fù)雜度:O(N^2) 空間復(fù)雜度:O(1)
public int[] divingBoard(int shorter, int longer, int k) {if(k==0){return new int[]{};}if(shorter==longer){return new int[1]{shorter*k};}int[] ans = new int[k+1];for(int i = 0 ;i<=k;i++){ans[i] = (k-i) *shorter + i*longer;}return ans;}2. 動態(tài)規(guī)劃
動態(tài)規(guī)劃流程
第 1 步:設(shè)計狀態(tài)
lengths[i] 為第 i 條跳水板的長度
第 2 步:狀態(tài)轉(zhuǎn)移方程
int distance = longer - shorter;
lengths[i] = lengths[i-1] + distance;
第 3 步:考慮初始化
lengths[0] = shorter * k;
第 4 步:考慮輸出
return lengths;
時間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)
public int[] divingBoard(int shorter, int longer, int k) {if (k == 0) {return new int[0];}if (shorter == longer) {return new int[]{shorter * k};}int distance = longer - shorter;int[] lengths = new int[k + 1];lengths[0] = shorter * k;for(int i = 1; i <= k; i++) {lengths[i] = lengths[i-1] + distance;}return lengths;}【總結(jié)】
1.數(shù)組的使用分聲明和初始化兩部分,兩者可同時進行,也可分開進行int[] array; 聲明
int[] array = new int{element1,element2,element3…}; 初始化方式1
int[] array = new int[length]; 初始化方式2
數(shù)組的初始化方式分為兩種:
一.靜態(tài)初始化:初始化時由程序員顯式指定每個數(shù)組元素的初始值;
int[] arrayName = new int[]{element1,element2,element3…}
二.動態(tài)初始化:初始化時由程序員指定數(shù)組的長度,由系統(tǒng)初始化每個數(shù)組元素的默認值。
int[] arrayName = new int[length];
注意:不要同時使用靜態(tài)初始化和動態(tài)初始化,也就是說,不要在進行數(shù)組初始化時,既指定數(shù)組的長度,也為每個數(shù)組元素分配初始值。
2.能用簡單數(shù)學(xué)推導(dǎo)的就用數(shù)學(xué) 本題的動態(tài)規(guī)劃也是基于數(shù)學(xué)推導(dǎo)
3.動態(tài)規(guī)劃流程
第 1 步:設(shè)計狀態(tài)
第 2 步:狀態(tài)轉(zhuǎn)移方程
第 3 步:考慮初始化
第 4 步:考慮輸出
第 5 步:考慮是否可以狀態(tài)壓縮
總結(jié)
以上是生活随笔為你收集整理的[Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程概论作业01
- 下一篇: percona-toolkit工具包安装