题目链接: Leetcode Weekly Contest 254
写在前面:
本次周赛做出第一题和第二题。
1、1967. Number of Strings That Appear as Substrings in Word
难度:Easy
题意
详见题目。
代码:
class Solution {
public int numOfStrings(String[] patterns, String word) {
int res=0;
for(String s:patterns){
if(word.contains(s)){
res++;
}
}
return res;
}
}
2、1968. Array With Elements Not Equal to Average of Neighbors
难度:Medium
题目大意:
对数组进行排列,要求除了首尾元素外任何一个元素都不能等于它左右两个元素的平均数。
思路:
对数组进行排序,前半部分是较小的元素,后半部分是较大的元素,每次取一个前半部分的元素,再去一个后半部分的元素,构成“锯齿”数组。
代码
class Solution {
public int[] rearrangeArray(int[] nums) {
Arrays.sort(nums);
int[] res=new int[nums.length];
int low=0,hi=(nums.length+1)/2;
int i=0;
while(i<nums.length){
if(i%2==0){
res[i]=nums[low++];
}
else{
res[i]=nums[hi++];
}
i++;
}
return res;
}
}
3、1969. Minimum Non-Zero Product of the Array Elements
难度:Medium
题目大意:
详见题目。
思路:
找规律,求指数幂的时候要用快速幂,同时注意取模的细节。
代码
class Solution {
public int minNonZeroProduct(int p) {
long mod=1000000007;
long max=((1L<<p)-1)%mod;
long n=(1L<<(p-1))-1;//幂指数不能提前取模
long res=( (max%mod)*(quickPow(max-1,n,mod)%mod) )%mod;
return (int)res;
}
public long quickPow(long a, long b, long mod)
{//快速幂
long ans = 1;
a = a % mod;
while (b > 0) {
if (b % 2 == 1)
ans= (ans * a) % mod;
b /= 2;
a = (a * a) % mod;
}
return ans;
}
}
4、1970. Last Day Where You Can Still Cross
难度:Hard
题目大意:
详见题目。
思路
参考高赞回答,二分+BFS,用二分来确定天数,BFS来判断能否找到符合题意的路径。
代码
class Solution {
public int latestDayToCross(int row, int col, int[][] cells) {
int l=1,r=row*col;
while(l<r){//二分
int mid=l+(r-l+1)/2;
if(canWalk(cells,row,col,mid)){
l=mid;
}
else{
r=mid-1;
}
}
return l;
}
int[][] dirs={{0,1},{0,-1},{1,0},{-1,0}};
public boolean canWalk(int[][] cells,int row,int col,int day){
int[][] grid=new int[row][col];
for(int i=0;i<day;i++){
grid[cells[i][0]-1][cells[i][1]-1]=1;//水域
}
//BFS
Queue<int[]> queue=new LinkedList<>();
for(int c=0;c<col;c++){
if(grid[0][c]==0){
queue.offer(new int[]{0,c});
grid[0][c]=1;//表示已经访问过
}
}
while(!queue.isEmpty()){
int[] cur=queue.poll();
int r=cur[0],c=cur[1];
if(r==row-1){
return true;
}
for(int[] dir:dirs){
int nr=r+dir[0],nc=c+dir[1];
if(nr<0||nr>=row||nc<0||nc>=col||grid[nr][nc]==1){
continue;
}
queue.offer(new int[]{nr,nc});
grid[nr][nc]=1;
}
}
return false;
}
}