给定一个整数数组,找到所有不同的可能的升序子序列,一个升序子序列的长度至少应为2。
样例
例1:
输入:
[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:
输入:
[65,21,-44,31,-8]
输出:
[[-44,-8],[-44,31],[21,31]]
注意事项
- 给定数组的长度不会超过15。
- 给定数组的范围为[-100, 100]。
- 给定数组可能包含重复,两个相同的整数也被算作是升序子序列的特殊情况。
输入测试数据 (每行一个参数)如何理解测试数据?
class Solution {
public:
/**
* @param nums: an integer array
* @return: all the different possible increasing subsequences of the given array
*/
set<vector<int>> myset;
vector<vector<int>> findSubsequences(vector<int> &nums) {
// Write your code here
vector<vector<int>> ret;
vector<int> tmp;
//sort(nums.begin(), nums.end());
backtrack(ret, tmp, nums, 0);
return ret;
}
void backtrack(vector<vector<int>>& ret, vector<int> &tempList, vector<int>& nums, int start)
{
//ret.push_back(tempList);
if(tempList.size() >= 2)
{
int i = 0;
for(i = 1; i < tempList.size(); i++)
{
if(tempList[i] < tempList[i-1])
break;
}
if(i == tempList.size())
{
if(myset.find(tempList) == myset.end())
{
myset.insert(tempList);
ret.push_back(tempList);
}
}
}
for(int i = start; i < nums.size(); i++)
{
tempList.push_back(nums[i]);
backtrack(ret, tempList, nums, i+1);
tempList.erase(tempList.begin() + tempList.size() - 1);
}
}
};