Leetcode Weekly Contest 254(快速幂、二分、BFS)

题目链接: 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;
    }
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值