前言
进行滴滴的笔试,被第一题只过了18%,在此记录一下:
一、题目描述
(这个地方照搬的牛客网上别人写的题目)
二、思路
我的思路比较简单,维护两个数组:red 和 blue,然后就直接DFS,判断新加进来的数能不能放在red或者blue数组中。递归终止条件就是遍历完了所有的数字。
我的错误代码如下所示:
考完之后分析,错误的原因应该是:
//下面 两行代码 位置应该调换一下(blue那边同理)
/*
因为如果result为true,程序就没有将red中的数字pop出来,
这样虽然对一次的用例没有影响,如果用例有多个,
下一次还使用的同一个red数组,那么就会产生问题。
*/
if(result) return true;
red.pop_back()
希望自己以后可以引以为戒吧,分析问题需要严谨!,完整代码如下所示:
#include<bits/stdc++.h>
using namespace std;
bool dfs(vector<int>& nums, int start, vector<int>& red, vector<int>& blue){
if(start >= nums.size()) return true;
// 对该值总共两种选择
if(red.size() == 0 || nums[start] > red.back()){
// 如果满足递增条件 或者 红色为0个
red.push_back(nums[start]);
bool result = dfs(nums, start+1, red, blue);
// 进行回溯
red.pop_back();
if(result) return true;
}
if(blue.size() ==0 || nums[start] < blue.back()){
// 如果满足递减的条件
blue.push_back(nums[start]);
bool result = dfs(nums, start+1, red, blue);
// 进行回溯
blue.pop_back();
if(result) return true;
}
return false;
}
int main()
{
int N, n;
vector<int> nums, red, blue;
cin>>N;
while(N--){
nums.clear();
cin>>n;
while(n--){
int tmp = 0;
cin>>tmp;
nums.push_back(tmp);
}// end while
// 进行处理
bool ans = dfs(nums, 0,red, blue);
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}