昨晚肠胃不好啊,一直在拉肚子,比赛都没法好好打。。。
思路:直接判断两个数组中的元素是否一样即可。
class Solution {
public boolean canBeEqual(int[] target, int[] arr) {
int[] num=new int[1005];
for(int i=0;i<target.length;i++)
num[target[i]]++;
for(int i=0;i<arr.length;i++)
num[arr[i]]--;
for(int i=0;i<1001;i++)
if(num[i]!=0)
return false;
return true;
}
}
5409. 检查一个字符串是否包含所有长度为 K 的二进制子串
思路:长度为k的二进制串个数为2^k个,因此我们统计下原串中长度为k的不同子串的个数即可。
class Solution {
public boolean hasAllCodes(String s, int k) {
if(s.length()-k+1<(1<<k))
return false;
int num=1;
StringBuilder str=new StringBuilder();
Map<String,Boolean> map=new HashMap<>();
for(int i=0;i<k;i++)
str.append(s.charAt(i));
map.put(str.toString(), true);
for(int i=k;i<s.length();i++) {
str.deleteCharAt(0);
str.append(s.charAt(i));
if(!map.containsKey(str.toString()))
num++;
map.put(str.toString(), true);
}
return num==(1<<k);
}
}
思路:这题做吐了,将两个有直接关联的课程倒着连边,之后从待查询课程dfs遍历先修课程即可。
class Solution {
boolean flag;
boolean[] vised;
List<Boolean> ans;
List<List<Integer>> list;
public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
vised=new boolean[n];
ans=new ArrayList<>();
list=new ArrayList<>();
for(int i=0;i<n;i++)
list.add(new ArrayList<>());
for(int i=0;i<prerequisites.length;i++)
list.get(prerequisites[i][1]).add(prerequisites[i][0]);
for(int i=0;i<queries.length;i++) {
for(int j=0;j<n;j++)
vised[j]=false;
flag=false;
dfs(queries[i][0],queries[i][1]);
ans.add(flag);
}
return ans;
}
private void dfs(int y,int x) {
if(flag) return;
vised[x]=true;
if(x==y) {
flag=true;
return;
}
for(int i=0;i<list.get(x).size();i++) {
int next=list.get(x).get(i);
if(vised[next])
continue;
dfs(y,next);
}
}
}
思路:定义dp[i][j][k]:表示第i行,第一个机器人纵坐标为j,第二个机器人纵坐标为k所能获得的最大樱桃数目。
class Solution {
public int cherryPickup(int[][] grid) {
int n=grid.length;
int m=grid[0].length;
int[][][] dp=new int[n][m][m];
for(int i=1;i<m-1;i++)
for(int j=1;j<m-1;j++)
dp[0][i][j]=-1;
for(int i=1;i<m;i++)
dp[0][i][m-1]=-1;
for(int i=0;i<m-1;i++)
dp[0][0][i]=-1;
dp[0][0][m-1]=grid[0][0]+grid[0][m-1];
for(int i=1;i<n;i++)
for(int j=0;j<m;j++)
for(int k=j;k<m;k++) {
int mx=dp[i-1][j][k];
if(j+1<m) mx=Math.max(mx, dp[i-1][j+1][k]);
if(k+1<m) mx=Math.max(mx, dp[i-1][j][k+1]);
if(j+1<m && k+1<m) mx=Math.max(mx, dp[i-1][j+1][k+1]);
if(j>0) mx=Math.max(mx, dp[i-1][j-1][k]);
if(k>0) mx=Math.max(mx, dp[i-1][j][k-1]);
if(j>0 && k>0) mx=Math.max(mx, dp[i-1][j-1][k-1]);
if(j>0 && k+1<m) mx=Math.max(mx, dp[i-1][j-1][k+1]);
if(j+1<m && k>0) mx=Math.max(mx, dp[i-1][j+1][k-1]);
if(mx==-1) {
dp[i][j][k]=-1;
continue;
}
if(j==k) dp[i][j][k]=mx+grid[i][j];
else dp[i][j][k]=mx+grid[i][j]+grid[i][k];
//System.out.println(i+" "+j+" "+k+" "+dp[i][j][k]);
}
int ans=0;
for(int i=0;i<m;i++)
for(int j=i;j<m;j++)
ans=Math.max(ans, dp[n-1][i][j]);
return ans;
}
}