12.水果成篮
移动窗口解决:定义i,j
用map数组储存
key:数组中的数
value:数组的下标
代码实现:
class Solution {
public int totalFruit(int[] tree) {
int max = 1;
Map<Integer, Integer> map = new HashMap<Integer, Integer>();//定义map数组
int j=0;
for(int i=0;i<tree.length;i++){
map.put(tree[i], i);
if(map.size() >2){
int minIndex = tree.length - 1;
for(int fruit : map.values()){//遍历map中的value
if(fruit < minIndex){//当fruit小于minIndex时
minIndex = fruit;//将fruit赋值给minIndex
}
}
map.remove(tree[minIndex]);//移除下标为minIndex的map
j = minIndex+1;
}
max = Math.max(max, i-j+1);
}
return max;
}
}
13.螺旋矩阵
第 1 个:从左向右
for (int j = i; j < n-i; j++) {
list.add(matrix[i][j]);
}
第 2 个:从上往下
for (int j = i+1; j < m-i; j++) {
list.add(matrix[j][(n-1)-i]);
}
第 3 个:从右往左,如果这一层只有1行,那么第一个循环已经将该行打印了,这里就不需要打印了,即 (m-1-i )!= i
for (int j = (n-1)-(i+1); j >= i && (m-1-i != i); j--) {
list.add(matrix[(m-1)-i][j]);
}
第4个:从下往上,如果这一层只有1列,那么第2个循环已经将该列打印了,这里不需要打印,即(n-1-i) != i
for (int j = (m-1)-(i+1); j >= i+1 && (n-1-i) != i; j--) {
list.add(matrix[j][i]);
}
代码实现:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>();
if(matrix == null || matrix.length == 0)
return list;
int m = matrix.length;
int n = matrix[0].length;
int i = 0;
//统计矩阵从外向内的层数,如果矩阵非空,那么它的层数至少为1层
int count = (Math.min(m, n)+1)/2;
//从外部向内部遍历,逐层打印数据
while(i < count) {
for (int j = i; j < n-i; j++) {
list.add(matrix[i][j]);
}
for (int j = i+1; j < m-i; j++) {
list.add(matrix[j][(n-1)-i]);
}
for (int j = (n-1)-(i+1); j >= i && (m-1-i != i); j--) {
list.add(matrix[(m-1)-i][j]);
}
for (int j = (m-1)-(i+1); j >= i+1 && (n-1-i) != i; j--) {
list.add(matrix[j][i]);
}
i++;
}
return list;
}
}