91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Java怎么計算數組中最長的子序列

發布時間:2021-03-19 17:45:58 來源:億速云 閱讀:245 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關使用Java怎么計算數組中最長的子序列,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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

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

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

java實現代碼:

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;
  // 從后往前遍歷數組,分別求出以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;
   // 最長子序列的長度最長為原始數組的長度,
   // 因為不需要我們求最長子序列的元素,所以直接結束循環,減少時間開銷
   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;
  }
  // 遍歷數組,找到最靠近end的并且<=end的元素位置i
  for (int i = arr.length - 1; i >= 0; i--) {
   if (arr[i] <= end) {
    // 從i處截斷數組,將arr[0]到arr[i-1]組成新數組繼續遞歸求長度
    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

看完上述內容,你們對使用Java怎么計算數組中最長的子序列有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

株洲县| 延安市| 淮南市| 咸丰县| 甘德县| 甘肃省| 资中县| 安达市| 博乐市| 法库县| 湘乡市| 郎溪县| 繁峙县| 宜宾市| 巴楚县| 朔州市| 溧阳市| 含山县| 五原县| 建水县| 佛学| 襄汾县| 天长市| 十堰市| 麻城市| 怀化市| 临沂市| 合作市| 南和县| 阜康市| 新乡县| 长兴县| 抚松县| 甘洛县| 元氏县| 高青县| 霍山县| 班戈县| 广德县| 延长县| 舟曲县|