灯泡开关 IV
本菜鸡的代码
想法是这样的:
首先把连续的0或者1都缩成一个,比如:
000111100111001
可以变成:
010101
除了第一位是一开始就是0,无需任何操作之外。
后面的每个都要反转一次,所以最终答案就是5。
class Solution {
public:int minFlips(string s) {int n = s.size(), l = 0, ans = 0 ;while(s[l]=='0' && l<n){if(l<n) ++l;}while(l<n){if(s[l]=='1'){while(s[l]=='1' && l<n){l++;}}else{while(s[l]=='0' && l<n){l++;}}ans++;}return ans;}
};
看了零神的代码。
class Solution {
public:int minFlips(string target) {int cnt = 0 , ans = 0;for(char c:target){int d = c-'0';if(d!=cnt){cnt ^= 1;ans ++; }}return ans;}
};
DP写法
class Solution {
public:int minFlips(string target) {int n = target.size();vector<int> dp(n);dp[0]= target[0]-'0';for(int i=1;i<n;i++){if(target[i]==target[i-1]){dp[i] = dp[i-1];}else{dp[i] = dp[i-1]+1;}}return dp[n-1];}
};
但是上面的做法实际上都是贪心的解决。