[1,1,1,0,0,0,1,1,1,1,0],2
6
可以将输入中的第3个0和第4个0变成1,新数组为[1,1,1,0,0,1,1,1,1,1,1],因此最长连续1的子数组长度为6
[0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1],3
10
可以将输入中的第3个0、第4个0,第5个0都变成1,新数组为[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1],因此最长连续1的子数组长度为10
最简单的暴力写法,利用栈,遇到不一样的元素时全部出栈,统记出现的次数添加到list里即可 import java.util.*; public class Solution { public int GetFragment (String str) { Queue<Integer> list=new LinkedList<>(); Stack<Character> s=new Stack<>(); int i=0,sum=0,out; for(char c:str.toCharArray()){ if(s.isEmpty()){ s.push(c); i++; }else if(!s.isEmpty()&&s.peek()==c){ s.push(c); i++; }else if(!s.isEmpty()&&s.peek()!=c){ while(!s.isEmpty()){ s.pop(); } list.add(i); s.push(c); i=1; } } if(!s.isEmpty()){ while(!s.isEmpty()){ s.pop(); } list.add(i); } int l=list.size(); //不能直接除以list.size()因为每次出队列,队列大小都会变小 for(int j=0;j<l;j++){ sum+=list.poll(); } System.out.println(!str.isEmpty()?sum/l:0); return out=!str.isEmpty()?sum/l:0; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param arr int整型一维数组 * @param k int整型 允许0变为1的个数 * @return int整型 */ int max = 0; int count = 0; public int GetMaxConsecutiveOnes (int[] arr, int k) { //滑动窗口 int left = 0; int right = 0; Map<Integer, Integer> map = new HashMap<>(); while(right < arr.length){ if (arr[right] == 0 && map.getOrDefault(0,0) <= k){ map.put(0,map.getOrDefault(0,0)+1); } if (arr[right] == 0 && map.getOrDefault(0,0) > k){ while(map.get(0) > k){ if (arr[left] == 0){ map.put(0,map.getOrDefault(0,0)-1); } left++; count--; } } count++; right++; max = Math.max(max,count); } return max; } }经典滑动窗口题目,就是多了个0替换1嘛