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。