给定一个01
构成的数组。你可以翻转1
变成0
或者反转0
变成1
。
请问最少反转多少次可以使得数组满足以下规则:
1
的后面可以是1
或者0
,而0
的后面必须是0
。
数组长度 n <= 100000
。
样例
样例 1:
输入: [1,0,0,1,1,1]
输出: 2
解释: 把两个0翻转成1。
样例 2:
输入: [1,0,1,0,1,0]
输出: 2
解释: 把第二个1和第三个1都翻转成0。
int flipDigit(vector<int> &nums)
{
//key前面是否有0,key =0 代表前面没0 key = 1 代表前面有0 set各种求和
int hasOne; //0 对应的和 代表前面没0
int hasZero; //1 对应的和 代表前面有0
if (nums.size() == 0)
{
return 0;
}
if (0 == nums[0])
{
hasOne = 1;
hasZero = 0;
}
else if (1 == nums[0])
{
hasOne = 0;
hasZero = 1;
}
int index = 1;
while (index < nums.size() - 1)
{
vector<int> tmpVec1; //0 对应的和 代表前面没0
vector<int> tmpVec2; //1 对应的和 代表前面有0
if (0 == nums[index])
{
int tmpHasOne = hasOne + 1;
int tmpHasZero = min(hasOne,hasZero);
hasOne = tmpHasOne;
hasZero = tmpHasZero;
}
else if (1 == nums[index])
{
int tmpHasOne = hasOne;
int tmpHasZero = min(hasOne+1, hasZero+1);
hasOne = tmpHasOne;
hasZero = tmpHasZero;
}
index++;
}
if (index < nums.size())
{
if (1 == nums[index])
{
hasZero++;
}
}
int maxSum = min(hasOne, hasZero);
return maxSum;
}