算法题总结

一、区间问题

螺旋矩阵II与螺旋矩阵

注意事项

全都按照行和列不一定相同来处理

一个是顺时针生成1个螺旋矩阵,1个是顺时针遍历螺旋矩阵,就当行和列不一定相同来分析,因为行和列相同属于其中1种特殊情况。

思路

借鉴代码随想录的方法,

1、定义好遍历区间全为左闭右开,不要一会左闭右闭一会左闭右开,导致区间的边界定义极其乱套。

2、遍历顺序为最上方1行,最右侧1列,最下方一行,最右侧1列,这样算是1圈,

3、遍历的圈数为矩阵的行数和列数的最小值除以2。

4、用一个int类型的start记录每圈的起点

5、如果矩阵的行数和列数相同,这非常好处理,因为如果为偶数,那么遍历完n/2圈后肯定将矩阵的元素都遍历完了,如果为奇数,那么最后只剩下矩阵的最中间元素(matrix[n/2][n/2]),在最后给该元素赋值为num就行了

6、如果矩阵的行数和列数不相同,通过分析,如果行数和列数的最小值为偶数,那么遍历完Math.min(m/2,n/2)圈后,矩阵所有元素恰好遍历完毕;如果行数和列数的最小值为奇数,那么遍历完Math.min(m/2,n/2)圈后,还有1行或1列元素没遍历完(这个自己举个例子,按照左闭右开的顺序顺时针遍历),如果行数为奇数,那么就遍历中间1行,如果列数为奇数,那么就遍历中间1列。

代码参考

代码可直接在IDEA上运行,进行任何维度的矩阵测试

1、生成螺旋矩阵

以下代码用于从左上角开始顺时针生成螺旋矩阵

//该函数用于生成螺旋矩阵
public class matrix2 {
    public static void main(String[] args) {
        int m = 5, n = 4;
        int[][] matrix = new int[m][n];
        int loop_cnt = Math.min(m / 2, n / 2);
        int cnt = 0;
        int start = 0;
        int num = 1;
        //遍历区间全部固定为左闭右开
        while (cnt < loop_cnt) {
            //遍历最上方1行
            for (int i = start; i < n - 1 - start; ++i) {
                matrix[start][i] = num++;
            }
            //遍历最右侧1列
            for (int i = start; i < m - 1 - start; ++i) {
                matrix[i][n - 1 - start] = num++;
            }
            //遍历最下方1行
            for (int i = n - 1 - start; i > start; --i) {
                matrix[m - 1 - start][i] = num++;
            }
            //遍历最左侧1列
            for (int i = m - 1 - start; i > start; --i) {
                matrix[i][start] = num++;
            }
            ++cnt;
            ++start;
        }
        int t = Math.min(m, n);
        //只要矩阵的行数与列数的最小值为奇数,就要继续遍历
        if (t % 2 == 1) {
            if (t == m) {
                for (int i = start; i < n - start; ++i) {
                    matrix[start][i] = num++;
                }
            } else {
                for (int i = start; i < m - start; ++i) {
                    matrix[i][start] = num++;
                }
            }
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                System.out.print(matrix[i][j] + ",");
            }
            System.out.println();
        }
    }
}
2、顺时针遍历矩阵

该思路、注意事项、区间定义方法和生成螺旋矩阵完全相同

将遍历结果存放到list容器里。

代码如下:

import java.util.ArrayList;
import java.util.List;

public class matrix {
    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3}, {5, 6, 7}, {9, 10, 11}, {13, 14, 15}, {1, 2, 3}};
        int m = matrix.length;
        int n = matrix[0].length;
        int start = 0;
        int loop_cnt = 0;
        int cnt = Math.min(m / 2, n / 2);
        List<Integer> result = new ArrayList<>();
        while (loop_cnt < cnt) {
            for (int i = start; i < n - start - 1; ++i) {
                result.add(matrix[start][i]);
            }
            for (int i = start; i < m - start - 1; ++i) {
                result.add(matrix[i][n - 1 - start]);
            }
            for (int i = n - start - 1; i > start; --i) {
                result.add(matrix[m - 1 - start][i]);
            }
            for (int i = m - start - 1; i > start; --i) {
                result.add(matrix[i][start]);
            }
            start++;
            loop_cnt++;
        }
        int t = Math.min(m, n);
        if(t % 2 == 1) {
            if(t == m) {
                for(int i = start; i < n -start; ++i){
                    result.add(matrix[start][i]);
                }
            }
            else {
                for(int i = start; i < m - start; ++i) {
                    result.add(matrix[i][start]);
                }
            }
        }
        for (Integer r : result) {
            System.out.print(r + ",");
        }
    }
}

结尾

目前正进行代码随想录的二刷,发现做过的题全忘了,而且感觉第一遍根本就没弄清楚,所以通过写博客的方式来增强对代码的理解和总结,如文中有任何错误,欢迎批评指正。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值