这里记录不定长滑窗:最长/最大值题单题解。
1. LC 1493 删除一个元素以后全为1的最长子数组
因为删且仅删一个元素,所以可以直接用一个标记位来记录这个删除的索引。
首先我们要肯定的一点是,除非整个数组都是1,不然肯定不删1的,删0的效果等于或优于删1,所以碰到1我们直接给长度+1就行。
- 如果当前元素是0
- 如果这个索引合法(例如≠-1),那么说明之前删过了,我们就得把之前删除的位置前面的所有1全部舍弃(舍弃过程中维护最大值),然后从上一次删除的位置后面一个位置开始算起,并更新当前位置是删除位置
- 如果这个索引不合法,说明压根没删过,那么把这个当前的位置记录为删除的位置,然后继续即可。
- 如果当前元素为1,那么直接长度+1,过。原因上面说了。
最后,这个题是必须删一个的,所以如果最后长度等于数组长度的话,就等于没删,需要删一个。
class Solution {
public int longestSubarray(int[] nums) {
int n = nums.length;
if(n==1){
return 0;
}
int rp = 0;
int cur = 0;
int ans = 0;
int lz = -1;
while(rp<n){
if(nums[rp]==1){
cur++;
}else{
if(lz!=-1){
ans = Math.max(ans,cur);
cur = rp-lz-1;
}
lz = rp;
}
rp++;
ans = Math.max(cur,ans);
}
return ans==n?n-1:ans;
}
}