ゴーイングLeetCodeレコード168週間のフィールドシーズン2019年12月22日

5292.アレイは、連続した数字のセットに分割されています

あなたの整数の配列与えるにはnums、正の整数kを、あなたはこの配列のいくつかを置くことができるかどうかを判断するk個の連続した数字の集合に分割されています。
あなたができる場合は、Trueを返してください、それ以外の場合はFalseを返します。

示例 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

分析:

kのグループ内の必要に応じてアレイ。合計だから、len / k二組。そうでない場合は割り切れ説明は対象外です。

それを考えるととても最初の配列をソートし、コレクションです。

  • まず、マップ統計的な現象で数回各番号。
  • 次に、配列の各要素を通過します。
    • 各要素の出現回数は、マップから取得されます。数は要素が友人の別のセットに組み込まれていることを示し、0の場合は、スキップすることができます。
      • 各要素は、あなたが番号を保存することができ、取り外し-1。
    • そして、コレクションのクエリ格を始めました。
      • マップから削除されnum+i、要素の残り数i1からlen / k
      • 数は、現在のコレクションが条件を満たしていないことを示し、0の場合。リターン偽
    • あなたへの書き込みは、すでに結果を得ます。しかし、多くは、その後のクエリ処理で0に要素の数を減らす必要がありますがあるかもしれません。
      • 動作シーケンスを低減するために、変数mを定義します。コレクションの数に発生した保守資格。mはに等しい場合len/k、説明は真の全修飾リターンのセットを発見しました。
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;
}

5293.ストリングの出現の最大数

あなたは以下の条件と任意のサブストリング出現の出現回数の最大値に文字列sを、してくださいリターンを与えます:

サブストリングの異なる文字の数が等しい未満でなければなりませんmaxLetters
長さはサブストリングは、より大きくする必要がありますminSize以下maxSize

输入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4
输出:2
解释:子串 "aab" 在原字符串中出现了 2 次。
它满足所有的要求:2 个不同的字母,长度为 3 (在 minSize 和 maxSize 范围内)。

探すためにこの質問のニーズはどの部分文字列の条件の出現の最大数倍の数です。

  • 最大と最小の長さが与えられ、実際には、最小長さの唯一の最大数は、必要に生じるで計算することができます。
  • 発生数、文字以下のサブストリングの数がいることを確認する対象の必要性の計算に基づいてmaxLetter、当然のことながら、算出組み合わせセット番号に使用。あなたは現在の文字列を放棄する条件を満たしていない場合。
  • 文字列が非常に長い長秒の場合はタイムアウトしないことを確実にするために。あなたは地図が各文字列が表示された回数を保存することができます。
  • トラバースの終了後、コレクションに表示され、統計の最大数は、結果です。
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();
}

おすすめ

転載: www.cnblogs.com/ginko/p/12080991.html