題目:
給你一個整數數組?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]]
這題的難點是母數列是沒有順序的,并且不能修改其順序
那么在排序中怎么判斷該數是否出現呢?這時候就要用到哈希表了
那么有哪些情況下需要用哈希表?
第一:這個數這一層已經被用過一次了。
第二:如果path數組中存在不止一個數,并且這個數大于nums[i]
如果出現這兩種情況就直接continue
剩下的就是for循環的部分。
這里再復習一下知識點:
首先是unordered_set<int> uset;是哈希表的聲明
uset.insert(nums[i]);是往哈希表中加數字
erase是刪除數字
下面看代碼
class Solution {
private:void backtranking(const vector<int>& nums, int startIndex){if(path.size() > 1){result.push_back(path);}unordered_set<int> uset;for(int i = startIndex;i < nums.size();i++){if((!path.empty() && nums[i] < path.back()) || uset.find(nums[i]) != uset.end())continue;uset.insert(nums[i]);path.push_back(nums[i]);backtranking(nums,i+1);path.pop_back();}}
public:vector<vector<int>> result;vector<int> path;vector<vector<int>> findSubsequences(vector<int>& nums) {backtranking(nums,0);return result;}
};