第一题
没啥好说的,签到题。
public class Solution {
public int minTimeToVisitAllPoints(int[][] p) {
int ans=0;
for(int i=1;i<p.length;i++) {
ans+=Math.max(Math.abs(p[i][0]-p[i-1][0]), Math.abs(p[i][1]-p[i-1][1]));
}
return ans;
}
}
第二题
统计一下每行每列服务器个数就行了。
public class Solution {
public int countServers(int[][] g) {
int n=g.length;
int m=g[0].length;
int[] r=new int[n];
int[] c=new int[m];
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(g[i][j]==1) {
r[i]++;
c[j]++;
}
}
}
int ans=0;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(g[i][j]==1&&(r[i]>=2||c[j]>=2))
ans++;
}
}
return ans;
}
}
第三题
想的太复杂了,其实数据范围这么小暴力即可,但pro的长度等于1e5该怎么处理呢,用字典树维护吗?知道的大佬请在下方评论,我将在第一时间回复您。
public class Solution {
public List<List<String>> suggestedProducts(String[] pro, String word) {
List<List<String>> ans=new ArrayList<List<String>>();
List<String> buf=new ArrayList<String>();
List<String> temp=new ArrayList<String>();
for(String s:pro)
buf.add(s);
for(int i=0;i<word.length();i++) {
temp.clear();
for(String s:buf) {
if(i>=s.length())
continue;
if(s.charAt(i)==word.charAt(i)) {
temp.add(s);
}
}
buf.clear();
buf.addAll(temp);
List<String> nowAns=new ArrayList<String>();
Collections.sort(buf);
for(int j=0;j<Math.min(3, buf.size());j++)
nowAns.add(buf.get(j));
ans.add(nowAns);
}
return ans;
}
}
第四题
dp[i][j]表示第i步位于下标为j的方案数,直接转移即可。
public class Solution {
public static final int Mod=(int) (1e9+7);
public int numWays(int sum, int n) {
n=Math.min(n, sum);
int[][] dp=new int[sum+1][n+1]; //dp[i][j] 表示第i步位于j的方案数
dp[0][0]=1;
for(int i=1;i<dp.length;i++) {
for(int j=0;j<=n;j++) {
dp[i][j]=(dp[i][j]+dp[i-1][j])%Mod;
if(j-1>=0)
dp[i][j]=(dp[i][j]+dp[i-1][j-1])%Mod;
if(j+1<n)
dp[i][j]=(dp[i][j]+dp[i-1][j+1])%Mod;
}
}
return dp[sum][0];
}
}