LeetCode-491インクリメントサブシーケンス

7643 ワード

テーマ説明:整数配列を与えて、あなたの任務はすべての配列の増分サブシーケンスを見つけることで、増分サブシーケンスの長さは少なくとも2です.例:
入力:[4,6,7,7]出力:[[4,6],[4,7],[4,6,7],[4,6,7],[4,6,7],[6,7],[7,7],[7,7],[4,7,[4,7,7]]
説明:
  • 所与の配列の長さは15を超えない.
  • 配列の整数範囲は[−100100]である.
  • 所与の配列には重複数が含まれる場合があり、等しい数は増加の1つと見なすべきである.

  • 考え方:
    この問題はLeetCode-39(組合せ総和)という問題に似ていて、構想は再帰遡及の一般的なやり方で解決することであり、異なるのはこの問題が最終的にsetを採用して重くする必要があることだ.
    Javaコード:
    class Solution {
        public List<List<Integer>> findSubsequences(int[] nums) {
            Set<List<Integer>> res = new HashSet<>(); //     
            findSubList(res,nums,0,new ArrayList<Integer>());
            return new ArrayList<List<Integer>>(res); 
        }
        public void findSubList(Set<List<Integer>> res,int[] nums,int index,List<Integer> tempList){
            if(tempList.size()>=2){    //            2
                res.add(new ArrayList<>(tempList));
            }
            for(int i=index;i<nums.length;i++){
                if(tempList.size()==0 || tempList.get(tempList.size()-1) <= nums[i]){
                    tempList.add(nums[i]);
                    findSub(res,nums,i+1,tempList);   //     
                    tempList.remove(tempList.size()-1);
                }
            }
        }
    }