491. 递增子序列
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
示例 1:
输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
示例 2:
**输入:**nums = [4,4,3,2,1]
输出:[[4,4]]
提示:
1 <= nums.length <= 15
-100 <= nums[i] <= 100
思考
这里使用回溯法。
主要面临两个问题
举例:求 3 ,1,3的递增序列
- 3,1 不递增
- 因为1小于3直接continue,跳到该层的下一个节点 3
举例:1,1,1
- 1 1 1 重复问题
- 同一父节点下的同层上使用过的元素就不能在使用了,比如 在第一层 1_1使用了 1_2,1_3就不能重复使用。因为存在1_1当遍历到1_2时应该执行continue操作。
代码
package 力扣;
import org.hamcrest.core.Is;
import org.w3c.dom.ls.LSException;
import sun.security.util.Length;
import javax.sound.midi.Soundbank;
import java.time.Year;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* @author yyq
* @create 2022-05-31 10:24
*/
public class leetcode491 {
public static void main(String[] args) {
leetcode491 l=new leetcode491();
List<List<Integer>> subsequences = l.findSubsequences(new int[]{1,2,1,1,3 });
System.out.println(subsequences);
}
List<Integer> list=new ArrayList<>();
List<List<Integer>> lists=new ArrayList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
int startIndex = 0;
backTracking(nums,list,lists,startIndex);
return lists;
}
private void backTracking(int[] nums, List<Integer> list, List<List<Integer>> lists, int startIndex) {
if(list.size()>1)
lists.add(new ArrayList<>(list));
for (int i = startIndex; i < nums.length; i++) {
// 剪支 出现 4 2 的情况
if(list.size()>1&&list.get(list.size()-1)>nums[i])
continue;
// 剪支 出现重复数据
int flag = 0;
for (int j = startIndex;j<i;j++){
if(nums[j] == nums[i]) {
flag=1;
break;
}
}
if(flag==1) continue;
list.add(nums[i]);
backTracking(nums,list,lists,i+1);
list.remove(list.size()-1);
}
}
}