2017-06-05 76 views
2

我不期望在這裏找到解決方案。但是我很難找出可能的錯誤。我覺得這是正確的解決方案,但是,解決方案並沒有通過我所有的測試案例。例如{2,2}。以下是我用暴力手段編寫的代碼(最壞的情況 - 複雜度爲n!)。任何幫助將不勝感激。我並不期待解決方案,但想知道我出錯的地方,以及如何正確解決問題。最長的子序列的長度

package org.practice; 
    import java.util.Arrays; 
    import java.util.HashSet; 
    import java.util.LinkedList; 
    import java.util.List; 

    public class LengthofLIS { 
     int maxLength = 0; 

     public static void main(String[] args) { 
      // TODO Auto-generated method stub 
      LengthofLIS l = new LengthofLIS(); 
      int[] nums = { 2,2 }; 
      l.lengthOfLIS(nums); 
     } 

     public int lengthOfLIS(int[] nums) { 
      if (nums.length == 1) 
       return nums.length; 
      List<Integer> hs = new LinkedList<>(); 
      dfs(nums, 0, 0, nums.length - 1, hs); 
      System.out.println(maxLength); 
      return maxLength; 
     } 

     public void dfs(int[] nums, int index, int length, int end, List<Integer> hs) { 

     if (index > end) { 
      return; 
     } 

     for (int i = index; i <= end; i++) { 

      if (hs.size() == 0) { 
       hs.add(nums[i]); 
       length++; 
      } else if (nums[i] > hs.get(hs.size() - 1)) { 
       hs.add(nums[i]); 
       length++; 
      } 

      else if (nums[i] <= hs.get(hs.size() - 1)) 
       continue; 

      dfs(nums, i + 1, length, end, hs); 
      //System.out.println("Printing " + Arrays.asList(hs)); 
      maxLength = Math.max(maxLength, hs.size()); 

      if (maxLength == nums.length) 
       break; 

      if (hs.size() != 0) { 
       hs.remove(hs.get(hs.size() - 1)); 
       length--; 
      } 
     } 
    } 
    } 
+0

在哪個平臺上提交?你得到什麼樣的錯誤?錯誤的答案或超時限? –

+0

我正在嘗試leetcode。我得到一個錯誤的答案。 – jojo

+0

很難找到你在代碼中做什麼。沒有人會徹底閱讀你的代碼。你需要描述你的算法。 –

回答

3

既然你沒有要求任何解決方案,我不會爲您提供一個,而在另一方面,你可以簡單地找到很多答案通過只是一個簡單的搜索。

以下是我從您的代碼明白:

public void dfs(int[] nums, int index, int length, int end, List<Integer> hs) { 
    if (index > end) { 
     return; 
    } 
    for (int i = index; i <= end; i++) { 
     if (hs.size() == 0) { 
      hs.add(nums[i]); 
      length++; 
     } 
     else if (nums[i] > hs.get(hs.size() - 1)) { 
      hs.add(nums[i]); 
      length++; 
     } 
     else if (i == end && nums[i] < hs.get(hs.size() - 1)) { //(1) 
      maxLength = Math.max(maxLength, hs.size()); 
     } 
     else if (nums[i] < hs.get(hs.size() - 1)) 
      continue; 
     dfs(nums, i + 1, length, end, hs); 
     if (hs.size() != 0) { //(2) 
      hs.remove(hs.get(hs.size() - 1)); 
      length--; 
     } 
    } 
} 
  1. 你想,要實現什麼?考慮最後一個元素是最大元素的情況,那麼您將始終打印0,因爲您永遠不會設置maxLength

  2. 您的主要問題在這裏。因爲您從列表中遞歸刪除a[i]a[i+1]。假設你有{2, 3, 100, 4, 5, 6, 1}而不是考慮[2, 3, 4, 5, 6]最長的列表,你的代碼會考慮[2, 4, 5, 6]最長的列表。

+0

感謝您的意見。感謝您瞭解我的代碼和反饋的努力。第1點是清楚的。關於第2點,我希望這不會發生。只要我從列表中刪除最後一個元素,我想在刪除元素的索引後面添加更多元素。假設我的列表「hs」有[2,3,100],並且發現沒有更多元素需要添加,我回到之前的狀態,通過刪除[100],我回到了前一個狀態[2,3]。我想要什麼現在要做的是進一步加上{4,5,6}使它成爲[2,3,4,5,6]。任何幫助將不勝感激。 – jojo

+0

@jojo不,你的代碼不會這樣做。多想一點,你會明白爲什麼,但如果我是你,我會嘗試另一種方法。所以我的意見閱讀了關於現有的算法並理解它們,我只是想指出你的錯誤。我認爲修復此代碼並不是一個好主意。 – Lrrr

+0

感謝您的幫助。我會考慮並嘗試修復它。感謝您的建議 – jojo