leetcode刷题(六)java

16.给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。

题目数据保证总会存在一个数值和不超过 k 的矩形区域。

class Solution {
    public int maxSumSubmatrix(int[][] matrix, int k) {
        int m = matrix.length;
        int n = matrix[0].length;
        int max = Integer.MIN_VALUE;
        int[][] dp = new int[m+1][n+1];
    
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                dp[i][j] = matrix[i][j];
                if(dp[i][j]==k)
                {
                    return k;
                }
                if(dp[i][j]<=k&&max<dp[i][j])
                {
                    max = dp[i][j];
                }
                for(int s=i;s<m;s++)
                {
                    for(int t=j;t<n;t++)
                    {
                        if(s==i&&t==j)
                        {
                            continue;
                        }
                        else if(s==i)
                        {
                            dp[s][t] = dp[s][t-1]+matrix[s][t];
                        }
                        else if(t==j)
                        {
                            dp[s][t] = dp[s-1][t]+matrix[s][t];
                        }
                        else{
                            dp[s][t] = dp[s-1][t] + dp[s][t-1] - dp[s-1][t-1] + matrix[s][t];
                        }
                        if(dp[s][t]==k)
                        {
                            return dp[s][t];
                        }
                        if(dp[s][t]==k)
                        {
                            return k;
                        }
                        if(dp[s][t]<=k&&max<dp[s][t])
                        {
                            max = dp[s][t];
                        }
                    }
                }
            }
        }
        return max;
    }
}

17.给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。

对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。

返回这些数字之和。题目数据保证答案是一个 32 位 整数。

class Solution {
    public static int f(TreeNode p,int ans)
    {
        if(p==null){
            return 0;
        }
        if(p.left==null&p.right==null)
        {
            ans = ans *2+p.val;
            return ans;
        }
        else
        {
            ans = ans *2 + p.val;
            return f(p.left,ans)+f(p.right,ans);
        }
    }
    public int sumRootToLeaf(TreeNode root) {
        return f(root,0);
    }
}

18.你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。

你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。

class Solution {
    public boolean isLongPressedName(String name, String typed) {
        int m=name.length();
        int n=typed.length();
        if(m>n)
        {
            return false;
        }
        int i=0,j=0;
        while(j<n&&i<m)
        {
            if(name.charAt(i)==typed.charAt(j))
            {
                i=i+1;
                j=j+1;
            }
            else
            {
                if(i==0)
                {
                    return false;
                }
                else{
                    if(typed.charAt(j)==typed.charAt(j-1))
                    {
                        j=j+1;
                    }
                    else{
                        return false;
                    }
                }
            }
        }
        while(j<n)
        {
            if(typed.charAt(j)!=typed.charAt(j-1))
            {
                return false;
            }
            else{
                j=j+1;
            }
        }
        if(j==n&&i<m)
        {
            return false;
        }
        return true;

    }
}

题目来源于leetcode。

### LeetCode Java 教程和技巧 #### 使用合适的数据结构 对于特定类型的目,选择适当的数据结构可以简化问并提高效率。例如,在处理队列操作时,`Deque<Integer> deque = new LinkedList<>();` 是一种有效的方式来初始化双端队列[^1]。 #### 动态规划的应用实例 以格雷编码为例,该类问可以通过动态规划的方法解决。具体来说,基于前一阶段的结果构建下一阶段的解决方案。比如从第 `n` 层的格雷码序列出发,通过在其反转后的每一个元素前面加上 '1' 来形成新的 `(n+1)` 层格雷码列表[^3]。 #### 子问分解策略 当面对复杂度较高的算法设计时,将大问拆分成若干个小而简单的子问是常见的做法之一。如果能够确保这些子问之间相互独立,则整个过程中的总工作量大致等于各部分之和。这表明随着输入大小的增长,所需处理的任务数目呈线性增长趋势,即时间复杂度为 O(n)[^4]。 #### 实战练习建议 为了更好地掌握编程技能以及应对实际面试场景下的挑战,定期参与像力扣这样的在线平台上的竞赛活动是非常有益处的。这里不仅提供了丰富的习资源供学习者反复操练,还允许用户提交自己的解答并与他人分享交流心得体验[^2]。 ```java // 示例代码:创建一个双向链表作为双端队列 Deque<Integer> deque = new LinkedList<>(); deque.addFirst(1); // 向头部添加元素 deque.addLast(2); // 向尾部添加元素 System.out.println(deque.pollFirst()); // 移除并返回最左边的元素 System.out.println(deque.pollLast()); // 移除并返回最右边的元素 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值