完成题目:
- LeetCode26、删除有序数组中的重复项
- LeetCode 283、移动零
- LeetCode 485、最大连续 1 的个数
- LeetCode 27、移除元素
题目描述:
给定一个二进制数组 nums
, 计算其中最大连续 1
的个数。(数组只可能为0或1){以此为例介绍理解解法}
例:输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
首先这道题与其他较为不同,其实也差不多,采用了快慢指针的做法
在此,有两个指针p1、p2
1、p1先行,直到找到第一个为1的值停留,作为计数的起点
2、p2传送,直接到p1所在位置
3、p2前进,直到连续的1被数完,即p2所在为0
4、p2-p1为连续个数,p1、p2回归同一位置开始循环
附上代码:
int findMaxConsecutiveOnes(vector<int>& nums)
{
int max=0, i=0,j=0;//快慢指针
int length=nums.size();
while(i<length)
{
while( i<length &&nums[i]==0 ) i++;
for(j=i;j<length;)
{
if(nums[j]==1)j++;
else break;
};
if(max<j-i)
max=j-i;
i=j;
}
return max;
}
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
此题同样可用上面的解法,一指针直接锁定第一的val值,另一指针以该指针为起点,遍历直到非val的出现,交换,此为一个循环;i遍历锁定下一个为val的值..........
下面给出另一种解法:
典型的双指针,一个 j 用于推进数组,一个 i 作为左边界
遍历时现在会出现三种情况:
1、i 、j都为非val值;双指针正常推进
2、因为 i, j 同时推进,所以在某一刻会同时检测到非val值,这时候 i 不动,即 i 左边为 有效部分,j 继续向前推进
3、j遍历到 非 val 值时 ,这时候如果 i 锁定的是 val 值 ,说明可以交换
总结:i 是否推进 由它锁定的是不是 val 决定 不是就推进,因为交换完一定是非val,也要推进
j是一直推进的;
注意交换时机
附上代码图:
int removeElement(vector<int>& nums, int val) {
int i=0,j=0,length=nums.size();
while(j<length)
{
if(nums[j]!=val && nums[i]!=val)
i++;
else if(nums[j]!=val&&nums[i]==val)
swop(nums[i++],nums[j]);
j++;
}
return i;
}