1. 程式人生 > 實用技巧 >查詢一個數組中的所有遞增子序列

查詢一個數組中的所有遞增子序列

題目說明

查詢給定的一個數組中的所有遞增子序列,子序列長度>=2並且可以為本身

解釋說明

給定一個數組,查詢一個所有遞增子序列,可以簡化成從陣列中找到所有長度為2、3、4......n的遞增子序列,而為了從中找到長度為i的遞增子序列,我們可以利用深度優先搜尋的方式,先將一個數入棧,然後進行向後的深度搜索,找到一個大於等於棧底的元素,就可以再次入棧,再進行深度搜索,直到遍歷完整個陣列
同時,我們為了高效利用每一個找到的遞增子序列,例如長度為2的遞增子序列一定包含在長度為3的遞增子序列中,所以我們可以直接遍歷一遍陣列,將其中每次深度優先搜尋完後長度大於1的序列儲存,這樣就可以成功找到所有遞增子序列

程式碼

List<List<Integer>> lists = new LinkedList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
    List<Integer> list = new LinkedList<>();
    dfs(nums,-1,list);
    return lists;
}
private void dfs(int[] nums, int now_local, List<Integer> list) {
    if (list.size() > 1) {
        lists.add(new LinkedList<>(list));//注意是new一下,因為後面會修改list的內容
    }
    Set<Integer> visited = new HashSet<>();//儲存已經被訪問的陣列元素
    for (int i = now_local + 1; i < nums.length; i++) {
        if (visited.contains(nums[i])) { 
            continue;
        }
        visited.add(nums[i]);
        if (now_local == -1 || nums[i] >= nums[now_local]) {
            list.add(nums[i]);
            dfs(nums, i, list);
            list.remove(list.size() - 1);
        }
    }
}