本学期算法课需要每周做几道leetcode的算法题,再写成题解贴到博客上面。先从几道简单的开始练练手,毕竟大三之后几乎都在做project,很少做算法题了。
1. 题目描述
Given a binary array, find the maximum number of consecutive 1s in this array.
2. 样例
Input: [1,1,0,1,1,1]
Output: 3
Explanation: The first two digits or the last three digits are consecutive 1s.
The maximum number of consecutive 1s is 3.
3. 注意事项
所有的数组仅仅是0和1组成,数组的长度是正整数,并且不会超过10000.
4. 分析
题目的意思很容易理解,给出一个由0和1任意组成的数组,需要我们找到连续的几个元素都是1的情况,把最长的结果输出出来。
思路也很容易想:设置两个计数器current_counter和max_counter,前者用来记录当前连续出现1的数目,后者用来记录目前为止最大的连续出现1的数目。
接着从数组的第一位开始进行遍历,判断当前的元素以及下一个是否为1,满足此条件则current_counter加1,否则则说明中间出现了0作为阻隔,1的出现不连续了。我们认为current_counter暂时完成了它的使命,将其与max_counter比较,大于max_counter的值则赋值给它,即我们的目的是每次出现连续个1的时候,我们会让max_counter记录最大的连续1的数目。
最后结束的时候,需要判断一下特殊的边界条件,例如只有一个元素为1的数组和只有一个元素为0的数组该如何处理。
5. 源码
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int i;
int current_counter = 1;
int max_counter = 0;
int length = nums.size();
for (i = 0; i < length; i++) {
if (nums[i] == nums[i+1] && nums[i] == 1) {
current_counter++;
}
else {
if (current_counter > max_counter && nums[i] == 1) {
max_counter = current_counter;
}
current_counter = 1;
}
}
if (length == 1 && nums[0] == 0) {
max_counter = 0;
}
return max_counter;
}
};
6. 心得
本题不难,拿来做恢复性训练比较好。注意一下边界情况的讨论即可,尤其是不要看错题,比如笔者第一次当成了需要输出0或者1的连续出现最多的情况,提交了多次。