国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

Java實現(xiàn)求數(shù)組最長子序列算法示例

2024-07-14 08:41:30
字體:
來源:轉載
供稿:網(wǎng)友

本文實例講述了Java實現(xiàn)求數(shù)組最長子序列算法。分享給大家供大家參考,具體如下:

問題:給定一個長度為N的數(shù)組,找出一個最長的單調(diào)自增子序列(不一定連續(xù),但是順序不能亂) 例如:給定一個長度為8的數(shù)組A{1,3,5,2,4,6,7,8},則其最長的單調(diào)遞增子序列為{1,2,4,6,7,8},長度為6。

思路1:第一眼看到題目,很多人肯定第一時間想到的是LCS。先給數(shù)組排個序形成新數(shù)組,然后再把新數(shù)組和原數(shù)組拿來求LCS,即可得到答案。這種解法很多人能想得到,所以就不再贅述。

思路2:按照思路1的想法,最后求LCS時還是得用到DP,我們干嘛不直接用DP來求解呢。對于數(shù)組arr,我們從后往前遍歷數(shù)組,分別求出當子序列以arr[i]結尾時的最長子序列,然后取其中的最大值。即可得到整個數(shù)組的最長子序列。 那么怎么求以arr[i]結尾時的最長子序列呢,這就轉換成一個DP問題了。要求arr[i]的最長子序列,只需要求出arr[i-1]的最長子序列。即:max{arr[i]}=max{arr[i-1]}+1

java實現(xiàn)代碼:

public class arrDemo { public static void main(String[] args) {  // int[] arr = {89, 256, 78, 1, 46, 78, 8};  int[] arr = { 1, 3, 5, 2, 4, 6, 7, 8 };  // int[] arr = {6, 4, 8, 2, 17};  int max = 0;  int maxLen = arr.length;  // 從后往前遍歷數(shù)組,分別求出以arr[i]結尾的時候的最長子序列長度  for (int i = arr.length - 1; i > 0; i--) {   int[] newArr = new int[i];   System.arraycopy(arr, 0, newArr, 0, i);   int currentLength = 1 + dp(newArr, arr[i]);   if (currentLength > max)    max = currentLength;   // 最長子序列的長度最長為原始數(shù)組的長度,   // 因為不需要我們求最長子序列的元素,所以直接結束循環(huán),減少時間開銷   if (max == maxLen)    break;  }  System.out.println(max); } public static int dp(int[] arr, int end) {  // 遞歸結束條件  if (arr.length == 1) {   // 小于end則包含在子序列中,子序列長度+1   if (arr[0] <= end)    return 1;   else    return 0;  }  // 遍歷數(shù)組,找到最靠近end的并且<=end的元素位置i  for (int i = arr.length - 1; i >= 0; i--) {   if (arr[i] <= end) {    // 從i處截斷數(shù)組,將arr[0]到arr[i-1]組成新數(shù)組繼續(xù)遞歸求長度    int[] newArr = new int[i];    System.arraycopy(arr, 0, newArr, 0, i);    // 分別計算包含arr[i]時的最長子序列和不包含arr[i]時的最長子序列,取最大值    int containLen = dp(newArr, arr[i]) + 1;    int notContainLen = dp(newArr, end);    return containLen > notContainLen ? containLen : notContainLen;   }  }  // 如果沒找到比end更小的,返回長度為0  return 0; }}

運行結果:

6

我的方法由于中間開辟了多個新數(shù)組,可能占用的空間有點多,不過我覺得應該也不是很多- -,具體我也沒統(tǒng)計過。如果有不對的地方還請指正。

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沽源县| 太仓市| 子长县| 金沙县| 琼结县| 宜良县| 康平县| 三门峡市| 保定市| 清新县| 色达县| 沙雅县| 阿巴嘎旗| 茂名市| 浦城县| 伊吾县| 新丰县| 保定市| 五河县| 忻州市| 顺平县| 鹤峰县| 汤原县| 松桃| 绵竹市| 辽源市| 长春市| 扶风县| 德惠市| 仙游县| 宕昌县| 方山县| 郴州市| 奉节县| 石家庄市| 集安市| 来宾市| 吉林省| 龙陵县| 团风县| 正蓝旗|