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;
}