演算法【最大子序列問題】
阿新 • • 發佈:2018-11-19
問題描述:
(這個問題描述可能不太準確 是根據我個人的理解寫出來的)
輸入一個序列的數字 求他的最大子序列 包括空集合
例如說 1 , 2 ,3
那麼他的子序列就是 【 [1,2,3] [1,2] [1,3] [2,3] [ 1 ] [2 ] [3] [] 】
我的解決思路是通過遞迴呼叫
1. 每個元素有兩種狀態,一種狀態是取當前元素,一種狀態是不取當前元素 所以需要 一個單獨的輔助陣列 用來記錄當前元素是否取
取完所有取當前元素的子情況,就獲取所有不取當前元素的子情況
2. 需要一個索引記錄 當前迴圈到的層數,如果獲取完所有元素就新增到List中
程式碼:
import java.util.ArrayList; import java.util.List; public class Solution { public static boolean v[] = new boolean[100]; public static List<List<Integer>> ans = newArrayList<List<Integer>>(); public void robot(int idx, int[] nums) { if (idx >= nums.length) { List<Integer> r = new ArrayList<Integer>(); for (int i = 0; i < nums.length;i++) { if (v[i]) { r.add(nums[i]); } } ans.add(r); return; } //這個是取當前元素的所有結果 v[idx] = true; robot(idx+1,nums); //這個是不取當前元素的所有結果 v[idx] = false; robot(idx+1,nums); } public List<List<Integer>> subsets(int [] nums) { ans.clear(); robot(0, nums); return ans; } public static void main(String[] args) { for (int i = 0; i < v.length; i++) { v[i] = false; } int [] nums = new int [3]; nums[0] = 1; nums[1] = 2; nums[2] = 3; Solution solution = new Solution(); List<List<Integer>> list = solution.subsets(nums); System.out.println(list); } }