算法学习:491.递增子序列

递增子序列

题目链接:力扣题目链接
难度:中等
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。


数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。


示例 :


输入: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]]

思路

此题要求自增子序列,是不能对原数组进行排序的,排序完的数组都是自增子序列了。
求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。
此题要遍历树形结构找每一个结点,startIndex每次都会加1,并不会无线递归。
但此题收集的结果有所不同,题目要求递归子序列的大小至少为2。

回溯代码

class Solution{
	List<List<Integer>> result = new ArrayList<>();
	LinkedList<Integer> path = new LinkedList<>();
	public List<List<Integer>> findSubsequences(int[] nums) {
		findSubsequences(nums,0);
		return result;
	}
	private void findSubsequences(int[] nums,int startIndex){
		if (path.size() > 1){
			result.add(new ArrayList<>(path));
		}	
		// 这里使用数组来进行去重操作,题目说数值范围[-100, 100]
		int[] used = new int[201];
		for(int i = startIndex;i < nums.length;i++){
			if(!path.isEmpty() && path.get(path.size()-1) > nums[i] || used[nums[i] + 100] == 1){
				continue;
			}
			// 记录这个元素在本层用过了,本层后面不能再用了
			used[nums[i] + 100] = 1;
			path.add(nums[i]);
			findSubsequences(nums,i+1);
			path.removeLast();
 		}
	}
}

你可能感兴趣的:(数据结构与算法,java,算法,数据结构)