(LeetCode)二维数组练习

这一部分的题我感觉还是比较简单的,毕竟涉及到的数据结构并不复杂,做了几道题下来发现几乎都能暴力求解暴力求解永远滴神 ,但我们追求的是最少的空间和最少的时间,暴力求解往往时间复杂度很高,我们需要寻求别的方法来解决问题。

挑几个题来扯一扯~~

598. 范围求和 II

比如这道题。拿到手之后就开始 无脑暴力 认真思考

class Solution {
    public int maxCount(int m, int n, int[][] ops) {
        int minR=Integer.MAX_VALUE,minC=Integer.MAX_VALUE;
        for(int[] A : ops){
            minR = Math.min(minR,A[0]);
            minC = Math.min(minC,A[1]);
        }
        return ops.length==0?m*n:minC*minR;
    }
}

在暴力求解敲了一半后想到了关键所在,然后就改了代码hiahiahia~~

419. 甲板上的战舰

还有这道题,这题目读起来就迷迷糊糊的,不知道讲了个啥……

读题,不耐下心来是不可以滴~~

读完题之后发现,每艘战舰的最左上的位置都可以作为战舰头部,然后其余的都看作尾部。想要找战舰的数量,我们只需要找战舰头部的数量。
那么问题来了,我们怎么找战舰头部?前面已经说过了,最左上的位置看做头部,再想想战舰不会相邻,所以头部的左边位置(如果存在的话)和上边位置(如果存在的话)一定就是’.’。
现在问题解决啦 ~~ 一次遍历来判断战舰头部并记录数量

class Solution {
    public int countBattleships(char[][] board) {
        int count = 0;
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == 'X' && (i == 0 || board[i - 1][j] == '.') && (j == 0 || board[i][j - 1] == '.')) {
                    count++;
                }
            }
        }
        return count;
    }
}

所以就会发现,往往最巧妙的办法并不是按固定的套路来的。这就感觉像是初中数学和高中数学做的一些开拓思维的题,比如找规律啊、列方程推解题公式啊、递推公式啊……之类的。

就像是之前很头疼的动态规划,没有系统的接触这个的时候总觉得一头雾水,然后学习了一下之后发现就跟高中数学中的那种递推公式一样,我们要做的就是找出递推公式。

越来越觉得数学思维很重要,突然想念高中数学老师hahah

还是得多加练习,加油~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值