General

Spiral 2-D array

for loop half of array size, add elements in 4 directions

public static List<Integer> matrixInSpiralOrder(List<List<Integer>> squareMatrix){
    List<Integer> result = new ArrayList<>();
    for (int i =0; i < Math.ceil(squareMatrix.size() * 0.5); i++){
        helper(squareMatrix, result, i);
    }
    return result;
}

private static void helper(List<List<Integer>> squareMatrix, List<Integer> result, int offset){
    int size = squareMatrix.size();
    if(offset * 2 + 1 == size){
        result.add(squareMatrix.get(offset).get(offset));
        return;
    }
    for (int i = offset; i < size - offset - 1; i++){
        result.add(squareMatrix.get(offset).get(i));
    }

    for (int i = offset; i < size - offset - 1; i++){
        result.add(squareMatrix.get(i).get(size - 1 - offset));
    }

    for (int i = size - 1 - offset; i > offset ; i--){
        result.add(squareMatrix.get(size - 1 - offset).get(i));
    }

    for (int i = size - 1 - offset; i > offset ; i--){
        result.add(squareMatrix.get(i).get(offset));
    }
}

395. Longest Substring with At Least K Repeating Characters

Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.

  • Find pivots whose's count less than k,split the string by pivots,untill no pivot in substring

public int longestSubstring(String s, int k) {
    char[] c = s.toCharArray();
    return helper(c, 0, s.length(), k);    
}

private int helper(char[] c, int start, int end, int k){
    if(end-start < k) return 0;

    // count the frequency of char
    Map<Character, Integer> map = new HashMap<>();
    for(int i=start; i<end; i++){
        map.put(c[i], map.getOrDefault(c[i], 0)+1);
    }

    // D & C
    for(Map.Entry<Character, Integer> entry: map.entrySet()){
        if(entry.getValue() < k){
            for(int i=start; i<end; i++){
                if(c[i] == entry.getKey()){
                    int left = helper(c, start, i, k);
                    int right = helper(c, i+1, end, k);
                    return Math.max(left, right);
                }
            }
        }
    }
    return end-start;
}

Last updated