题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
本题可以采用2.5次遍历的方法来解决。为什么说是2.5次呢?看了下面就知道了。
第一次遍历,找出数组中所有偶数,按照相对次序存到另外一个新建的数组中。
第二次遍历,把数组中所有奇数都存到数组的前半部分。此时可以不用管偶数,因为偶数已经在第一次遍历时存好了。
第二点五次遍历,遍历存偶数的数组,将其中的元素依次添加到原数组的后半部分。因为这次只需要遍历存偶数的数组,所以称之为半次遍历。
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber)
{
if (!root)
return list;
dfsFind(root, expectNumber); //深度优先搜索
return list;
}
private:
vector<vector<int> > list;
vector<int> tmp;
void dfsFind(TreeNode* root, int number)
{
tmp.push_back(root->val); //存根节点的值
if (!root->left && !root->right && root->val == number) //为叶节点,并且值为number
list.push_back(tmp); //存入数组
else
{
if (root->left)
dfsFind(root->left, number - root->val); //搜索左子树
if (root->right)
dfsFind(root->right, number - root->val); //搜索右子树
} //不满足值的要求的叶节点什么也不做
tmp.pop_back(); //删除最后一个元素,回到上一层递归
}
};