- leetcode491-递增子序列
题型:递归
难度:中等
题目:给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
代码:
class Solution {
public:
vector<vector<int> > vec;
vector<int> tempvec;
public:
void dfs(vector<int>& nums,int curIndex,int lastnum){
if(curIndex >= nums.size())
{
if(tempvec.size() >= 2)
{
vec.push_back(tempvec);
}
return;
}
if(nums[curIndex] >= lastnum)
{
tempvec.push_back(nums[curIndex]);
dfs(nums,curIndex+1,nums[curIndex]);
tempvec.pop_back();
}
if(nums[curIndex] != lastnum)
{
dfs(nums,curIndex+1,lastnum);
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
int n = nums.size();
if(n <= 1) return vec;
dfs(nums,0,INT_MIN);
return vec;
}
};
- leetcode464-我能赢吗
题型:递归
难度:中等
题目:在 “100 game” 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到 100 的玩家,即为胜者。如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。
给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏时都表现最佳)?你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。
代码:
class Solution {
public:
bool dfs(int maxChoosableInteger, int desiredTotal,int state,vector<int> &vec)
{
if(vec[state] != 0)
return vec[state]==1;
bool res = false;
for(int i=maxChoosableInteger;i>0;i--)
{
int cur = 1<<(i-1);
if((state & cur) != 0)
continue;
if(i>=desiredTotal)
{
res = true;
break;
}
if(!dfs(maxChoosableInteger,desiredTotal-i,state|cur,vec ) )
{
res = true;
break;
}
}
vec[state] = res?1:2;
return res;
}
bool canIWin(int maxChoosableInteger, int desiredTotal) {
if((maxChoosableInteger*(maxChoosableInteger+1)/2) < desiredTotal)
return false;
if(desiredTotal==0 || desiredTotal<=maxChoosableInteger )
return true;
vector<int> vec(1<<maxChoosableInteger);
return dfs(maxChoosableInteger,desiredTotal,0,vec);
}
};