这一部分的题我感觉还是比较简单的,毕竟涉及到的数据结构并不复杂,做了几道题下来发现几乎都能暴力求解暴力求解永远滴神 ,但我们追求的是最少的空间和最少的时间,暴力求解往往时间复杂度很高,我们需要寻求别的方法来解决问题。
挑几个题来扯一扯~~
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
还是得多加练习,加油~~