当前位置: 代码迷 >> 综合 >> LeetCode 1529. 灯泡开关 IV (思维、模拟、DP)
  详细解决方案

LeetCode 1529. 灯泡开关 IV (思维、模拟、DP)

热度:14   发布时间:2024-02-05 02:28:38.0

灯泡开关 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];}
};

但是上面的做法实际上都是贪心的解决。