[Leetcode][第491题][JAVA][递增子序列][回溯][RK算法]
生活随笔
收集整理的這篇文章主要介紹了
[Leetcode][第491题][JAVA][递增子序列][回溯][RK算法]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[中等]
【解答思路】
1. 二進制枚舉 + 哈希
復雜度
2. 遞歸枚舉 + 減枝
一個遞歸枚舉子序列的通用模板,即用一個臨時數組temp 來保存當前選出的子序列,使用cur 來表示當前位置的下標,在 dfs(cur, nums) 開始之前,[0,cur?1] 這個區間內的所有元素都已經被考慮過,而[cur,n] 這個區間內的元素還未被考慮。在執行 dfs(cur, nums) 時,我們考慮 cur 這個位置選或者不選,如果選擇當前元素,那么把當前元素加入到temp 中,然后遞歸下一個位置,在遞歸結束后,應當把temp 的最后一個元素刪除進行回溯;如果不選當前的元素,直接遞歸下一個位置。
List<List<Integer>> ans = new ArrayList<List<Integer>>(); List<Integer> temp = new ArrayList<Integer>(); public void dfs(int cur, int[] nums) {if (cur == nums.length) {// 判斷是否合法,如果合法判斷是否重復,將滿足條件的加入答案if (isValid() && notVisited()) {ans.add(new ArrayList<Integer>(temp));}return;}// 如果選擇當前元素temp.add(nums[cur]);dfs(cur + 1, nums);temp.remove(temp.size() - 1);// 如果不選擇當前元素dfs(cur + 1, nums); }復雜度
【總結】
1. 一個遞歸枚舉子序列的通用模板,即用一個臨時數組temp 來保存當前選出的子序列,使用cur 來表示當前位置的下標,在 dfs(cur, nums) 開始之前,[0,cur?1] 這個區間內的所有元素都已經被考慮過,而[cur,n] 這個區間內的元素還未被考慮。在執行 dfs(cur, nums) 時,我們考慮 cur 這個位置選或者不選,如果選擇當前元素,那么把當前元素加入到temp 中,然后遞歸下一個位置,在遞歸結束后,應當把temp 的最后一個元素刪除進行回溯;如果不選當前的元素,直接遞歸下一個位置。
List<List<Integer>> ans = new ArrayList<List<Integer>>(); List<Integer> temp = new ArrayList<Integer>(); public void dfs(int cur, int[] nums) {if (cur == nums.length) {// 判斷是否合法,如果合法判斷是否重復,將滿足條件的加入答案if (isValid() && notVisited()) {ans.add(new ArrayList<Integer>(temp));}return;}// 如果選擇當前元素temp.add(nums[cur]);dfs(cur + 1, nums);temp.remove(temp.size() - 1);// 如果不選擇當前元素dfs(cur + 1, nums); }2.RK算法 哈希散列表
【數據結構與算法】字符串匹配 BF算法 RK算法
轉載鏈接:https://leetcode-cn.com/problems/increasing-subsequences/solution/di-zeng-zi-xu-lie-by-leetcode-solution/
總結
以上是生活随笔為你收集整理的[Leetcode][第491题][JAVA][递增子序列][回溯][RK算法]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 06-BCD计数器设计与应用——小梅哥F
- 下一篇: 【常用正则大全】