给你一个整数数组 nums
和一个正整数 k,请你判断是否能够把这个数组划分红一些由 k 个连续数字组成的集合。
若是能够,请返回 True;不然,返回 False。java
示例 1: 输入:nums = [1,2,3,3,4,4,5,6], k = 4 输出:true 解释:数组能够分红 [1,2,3,4] 和 [3,4,5,6]。
**题目表述为集合,不是数组。 =__=**数组
输入:nums = [3,3,2,2,1,1], k = 3 输出:true
分析:ide
须要将数组按照k个一组划分。因此一共有len / k
个集合。若是不能整除说明不符合条件。code
由于考虑到是集合,因此先将数组进行排序。排序
num+i
的元素剩余次数,i
从1到len / k
。len/k
,说明已经找到了所有符合条件的集合返回true;public boolean isPossibleDivide(int[] nums, int k) { int len = nums.length; if(len%k!=0){ return false; } Arrays.sort(nums); Map<Integer,Integer> map = new HashMap<>(); for(int num:nums){ map.put(num,map.getOrDefault(num,0)+1); } int count = len/k; int m = 0; for(int num:nums){ int start = map.get(num); if(start==0){ //已经没有了 continue; } map.put(num,start-1); for(int i =1;i<k;i++){ int temp = map.getOrDefault(num+i,0); if(temp==0){ //当前序列不合法。 return false; } map.put(num+i,temp-1); } m++; if(m==count){ return true; } } return true; }
给你一个字符串 s ,请你返回知足如下条件且出现次数最大的 任意 子串的出现次数:leetcode
子串中不一样字母的数目必须小于等于 maxLetters
。
子串的长度必须大于等于 minSize
且小于等于 maxSize
。字符串
输入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4 输出:2 解释:子串 "aab" 在原字符串中出现了 2 次。 它知足全部的要求:2 个不一样的字母,长度为 3 (在 minSize 和 maxSize 范围内)。
这道题须要寻找的是知足条件的出现次数最大的任意子串的次数。get
maxLetter
,固然使用Set结合计算数量。若是不符合条件就舍弃当前子串。public int maxFreq(String s, int maxLetters, int minSize, int maxSize) { char[] arr= s.toCharArray(); Map<String,Integer> map = new HashMap<>(); for(int i =0;i<=s.length()-minSize;i++){ if(checkOut(arr,i,i+minSize-1)<=maxLetters){ String key = String.valueOf(arr,i,minSize); map.put(key,map.getOrDefault(key,0)+1); } } int count = 0; for(Integer num : map.values()){ count = count<num ?num:count; } return count; } public int checkOut(char[] arr,int start,int end){ Set<Character> set = new HashSet<>(); for(int i =start;i<=end;i++){ set.add(arr[i]); } return set.size(); }