最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年07月11日 11:35:32   作者:antchow-  
這篇文章主要介紹了Java實(shí)現(xiàn)求數(shù)組最長(zhǎng)子序列算法,涉及java針對(duì)數(shù)組的遞歸遍歷、判斷相關(guān)操作技巧,需要的朋友可以參考下

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

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

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

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

java實(shí)現(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]結(jié)尾的時(shí)候的最長(zhǎng)子序列長(zhǎng)度
  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;
   // 最長(zhǎng)子序列的長(zhǎng)度最長(zhǎng)為原始數(shù)組的長(zhǎng)度,
   // 因?yàn)椴恍枰覀兦笞铋L(zhǎng)子序列的元素,所以直接結(jié)束循環(huán),減少時(shí)間開銷
   if (max == maxLen)
    break;
  }
  System.out.println(max);
 }
 public static int dp(int[] arr, int end) {
  // 遞歸結(jié)束條件
  if (arr.length == 1) {
   // 小于end則包含在子序列中,子序列長(zhǎng)度+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處截?cái)鄶?shù)組,將arr[0]到arr[i-1]組成新數(shù)組繼續(xù)遞歸求長(zhǎng)度
    int[] newArr = new int[i];
    System.arraycopy(arr, 0, newArr, 0, i);
    // 分別計(jì)算包含arr[i]時(shí)的最長(zhǎng)子序列和不包含arr[i]時(shí)的最長(zhǎng)子序列,取最大值
    int containLen = dp(newArr, arr[i]) + 1;
    int notContainLen = dp(newArr, end);
    return containLen > notContainLen ? containLen : notContainLen;
   }
  }
  // 如果沒找到比end更小的,返回長(zhǎng)度為0
  return 0;
 }
}

運(yùn)行結(jié)果:

6

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

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 一文詳解Spring攔截鏈的實(shí)現(xiàn)原理

    一文詳解Spring攔截鏈的實(shí)現(xiàn)原理

    在?Web應(yīng)用開發(fā)中,攔截器(Interceptor)是一種非常重要的機(jī)制,能夠在請(qǐng)求處理的各個(gè)階段進(jìn)行前置和后置處理,本文主要來探討一下?Spring?攔截鏈的實(shí)現(xiàn)原理,需要的可以了解下
    2025-01-01
  • 利用Spring JPA中的@Version注解實(shí)現(xiàn)樂觀鎖

    利用Spring JPA中的@Version注解實(shí)現(xiàn)樂觀鎖

    樂觀鎖是數(shù)據(jù)庫和應(yīng)用程序中使用的一種并發(fā)控制策略,用于在多個(gè)事務(wù)嘗試更新單個(gè)記錄時(shí)確保數(shù)據(jù)完整性,Java Persistence API (JPA) 提供了一種借助@Version注解在 Java 應(yīng)用程序中實(shí)現(xiàn)樂觀鎖的機(jī)制,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • 普通類注入不進(jìn)spring bean的解決方法

    普通類注入不進(jìn)spring bean的解決方法

    這篇文章主要介紹了普通類注入不進(jìn)spring bean的解決方法,幫助大家更好的理解和使用spring bean,感興趣的朋友可以了解下
    2021-01-01
  • Java8中對(duì)于LocalDateTime的序列化和反序列化問題

    Java8中對(duì)于LocalDateTime的序列化和反序列化問題

    這篇文章主要介紹了Java8中對(duì)于LocalDateTime的序列化和反序列化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java中常用的數(shù)據(jù)庫連接池_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中常用的數(shù)據(jù)庫連接池_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏
    2017-08-08
  • springboot實(shí)現(xiàn)全局異常捕獲的使用示例

    springboot實(shí)現(xiàn)全局異常捕獲的使用示例

    任何系統(tǒng),我們不會(huì)傻傻的在每一個(gè)地方進(jìn)行異常捕獲和處理,整個(gè)系統(tǒng)一般我們會(huì)在一個(gè)的地方統(tǒng)一進(jìn)行異常處理,本文主要介紹了springboot實(shí)現(xiàn)全局異常捕獲的使用示例,感興趣的可以了解一下
    2023-11-11
  • Java Collection集合的三種遍歷方式詳解

    Java Collection集合的三種遍歷方式詳解

    Collection集合遍歷的方式有三種,迭代器foreach/增強(qiáng)for循環(huán)lambda表達(dá)式,這篇文章主要介紹了Java Collection集合的三種遍歷方式,需要的朋友可以參考下
    2022-11-11
  • 帶你輕松了解Modbus協(xié)議

    帶你輕松了解Modbus協(xié)議

    這篇文章主要給大家介紹了關(guān)于Modbus協(xié)議的相關(guān)資料,此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的,需要的朋友可以參考下
    2021-11-11
  • Java SpringBoot的相關(guān)知識(shí)點(diǎn)詳解

    Java SpringBoot的相關(guān)知識(shí)點(diǎn)詳解

    這篇文章主要介紹了SpringBoot的相關(guān)知識(shí)點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-10-10
  • java實(shí)現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實(shí)例

    java實(shí)現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實(shí)例

    本篇文章主要介紹了java實(shí)現(xiàn)附件預(yù)覽(openoffice+swftools+flexpaper)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10

最新評(píng)論

罗平县| 崇礼县| 濮阳县| 永新县| 广灵县| 上杭县| 芮城县| 长垣县| 封开县| 图木舒克市| 财经| 监利县| 阳原县| 桑日县| 江川县| 社旗县| 红安县| 进贤县| 鄄城县| 绍兴县| 泌阳县| 连南| 威信县| 南川市| 顺昌县| 承德县| 肇庆市| 桂平市| 内乡县| 平凉市| 烟台市| 延庆县| 莱阳市| 普宁市| 晋中市| 郯城县| 青铜峡市| 加查县| 石楼县| 宜阳县| 永年县|