给定一个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; }
|