Day06——数组专题


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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值