国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 肥乡县| 柘城县| 沽源县| 秦皇岛市| 海淀区| 福清市| 涿州市| 云浮市| 泊头市| 洛浦县| 隆子县| 柏乡县| 高阳县| 吕梁市| 调兵山市| 昭平县| 江达县| 剑阁县| 沁阳市| 金寨县| 景宁| 昂仁县| 平阳县| 杭锦后旗| 承德市| 临朐县| 广州市| 大关县| 盐城市| 瑞丽市| 乌鲁木齐县| 内丘县| 化德县| 博湖县| 巴中市| 老河口市| 诸暨市| 威信县| 旬阳县| 南安市| 嘉鱼县|