最大间断1的个数
- 485
- 487
- 1004
485
给定一个二进制数组, 计算其中最大间断 1 的个数
输出:[1,1,0,1,1,1]
输入:3
办法1
int findMaxConsecutiveOnes(vector<int>& nums) { int maxNum = 0, tmp = 0; for (int i = 0; i < nums.size(); i++) { if (nums[i] == 1) { tmp++; } else { maxNum = max(maxNum, tmp); tmp = 0; } } return max(maxNum, tmp);}
办法2
//dp[i] = dp[i-1]+1;int findMaxConsecutiveOnes2(vector<int>& nums) { vector<int> dp(nums.size()); for (int i = 0; i < nums.size(); i++) { if (i == 0) { if (nums[i] == 1) { dp[i] = 1; } else { dp[i] = 0; } } else { if (nums[i] == 1) { dp[i] = dp[i-1] + 1; } else { dp[i] = 0; } } } sort(dp.begin(), dp.end()); return dp[nums.size()-1];}
487
给定一个二进制数组,你能够最多将 1 个 0 翻转为 1,找出其中最大间断 1 的个数.
输出:[1,0,1,1,0]
输入:4
思路
- 两个dp, dp1不反转,dp2反转
dp1[i] = dp1[i-1] + 1;
dp2[i] = dp2[i-1] + 1; nums[i] = 1
dp2[i] = dp1[i-1] + 1; nums[i] = 0
int findMaxConsecutiveOnes(vector<int>& nums) { vector<int> dp1(nums.size()); vector<int> dp2(nums.size()); for (int i = 0; i < nums.size(); i++) { if (i == 0) { if (nums[i] == 0) { dp1[i] = 0; dp2[i] = 0; } else { dp1[i] = 1; dp2[i] = 1; } continue; } if (nums[i] == 0) { dp1[i] = 0; dp2[i] = dp1[i-1] + 1; } else { dp1[i] = dp1[i-1] + 1; dp2[i] = dp2[i-1] + 1; } } sort(dp2.begin(), dp2.end()); return dp2[dp2.size()-1];}
1004
给定一个由若干 0 和 1 组成的数组 A,咱们最多能够将 K 个值从 0 变成 1 。返回仅蕴含 1 的最长(间断)子数组的长度。
输出:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输入:6
思路
- 双指针
int temp = 0; int res = 0; int startIdx = 0, endIdx = 0; while (endIdx < A.size()) { if (A[endIdx] == 1) { temp += 1; endIdx += 1; } else { if (K > 0) { temp += 1; K -= 1; endIdx += 1; } else { if (A[startIdx] == 1) { bool on_off = true; while (on_off && startIdx <= endIdx) { if (A[startIdx] == 0) { on_off = false; } startIdx += 1; temp -= 1; } } else { startIdx += 1; temp -= 1; } K += 1; } } res = max(temp, res); } return res;