第一次参加周赛,被虐的体无完肤,如果以后周末没有其他任务的话,一定会每周坚持找虐的。。。。。
class Solution {
public boolean canFormArray(int[] arr, int[][] pieces) {
int n=arr.length;
int m=pieces.length;
for(int i=0;i<n;){ //遍历arr的数组中的值
int cur=arr[i];
int index=-1; //未在peices中找到arr[i]的值时候,标识位设置为-1
for(int k=0;k<m&&index==-1;k++){
if(cur==pieces[k][0]){
index=k;
}
}
if(index==-1){
return false;
}
for(int v:pieces[index]){ //在pieces[index]数组中可能有arr[i]中的后续数值能够与之匹配,所以需要遍历一下
if(v==arr[i]){
i++;
}else{
return false;
}
}
}
return true;
}
}
class Solution {
public int countVowelStrings(int n){
int dp[][] = new int[n][5];
//dp[i][0]表示:字符串长度为(i+1)且以'a'开头的所有满足题意,dp[i][1]即为以'e'为开头……
dp[0][0]=dp[0][1]=dp[0][2]=dp[0][3]=dp[0][4]=1;
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3] + dp[i - 1][4];
dp[i][1] = dp[i - 1][1] + dp[i - 1][2] + dp[i - 1][3] + dp[i - 1][4];
dp[i][2] = dp[i - 1][2] + dp[i - 1][3] + dp[i - 1][4];
dp[i][3] = dp[i - 1][3] + dp[i - 1][4];
dp[i][4] = dp[i - 1][4];
}
return dp[n - 1][0] + dp[n - 1][1] + dp[n - 1][2] + dp[n - 1][3] + dp[n - 1][4];
}
}
class Solution {
public int furthestBuilding(int[] heights, int bricks, int ladders) {
PriorityQueue<Integer>heap=new PriorityQueue<>();//默认创建最小堆
int sum=0;//已经用的砖块初始化为0
for(int i=1;i<heights.length;i++){
if(heights[i]>heights[i-1]){
int h=heights[i]-heights[i-1];
if(heap.size()<ladders){
heap.add(h);//首先使用最小堆将前ladders个跨度的高度差放到堆中,默认梯子扛下了生活的所有重担。。。
}else{
if(!heap.isEmpty()&&heap.peek()<h){//如果新的高度差比堆顶(维护的最小值)大,就将堆顶的用砖块代替,并将高度差入堆
sum+=heap.poll();
heap.add(h);
}else{//如果新的高度差比堆顶(维护的最小值)小,就将该高度差用砖块代替,堆不变
sum+=h;
}
}
}
if(sum>bricks){//如果高度差比给定的砖块数量都大,那么直接返回该有高度前的索引
return i-1;
}
}
return heights.length-1;//;遍历完成就返回数组最后一个元素
}
}
class Solution {
public String kthSmallestPath(int[] destination, int k) {
int h=destination[1];
int v=destination[0];
StringBuilder res=new StringBuilder();
int [][]dp=new int [h+v][h];//dp[i][j]表示组合数,从i随机选择j的所有数量
dp[0][0]=1;
for(int i=1;i<h+v;i++){
dp[i][0]=1;
for(int j=1;j<=i&&j<h;j++){
dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
}
}
//依次求解各个位置上的字符:
while(h>0&&v>0){
int low=dp[h+v-1][h-1];//此处放置‘H’的所有组合数
if(k<=low){
res.append('H');
h--;
}else{
res.append('V');
v--;
k-=low;//k>low说明此处不应该放置'H'应该放置‘V’,所以放置后也应该将k的值更新一下
}
}
if(h==0){
for(int i=0;i<v;i++){
res.append('V');
}
}else{
for(int i=0;i<h;i++){
res.append('H');
}
}
return res.toString();
}
}