Leetcode Weekly Contest 232(详细解析)

题目链接: Leetcode Weekly Contest 232

写在前面:

本次周赛难度不大,有一千多人AK了,我只做出来头两道,还需多加努力。

1、1790. Check if One String Swap Can Make Strings Equal

难度:Easy

题目大意:

给出两个字符串,只能交换其中一个字符串中两个字符的位置,也可以选择什么也不做,判断能否使两个字符串相等。

思路:

找到字符串1和字符串2中两个不想同的字符,如何对字符串1中的两个字符进行交换操作,再判断两个字符串是否相等。

代码

class Solution {
    public boolean areAlmostEqual(String s1, String s2) {
        StringBuffer sb1=new StringBuffer(s1);
        StringBuffer sb2=new StringBuffer(s2);
        int diffCount=0;//字符不想相同的个数
        char[] diffChar=new char[2];//不同的字符
        int[] diffIndex=new int[2];//不同字符的下标
        for(int i=0;i<sb1.length();i++){
            if(sb1.charAt(i)!=sb2.charAt(i)){
                diffIndex[diffCount]=i;
                diffChar[diffCount]=sb1.charAt(i);
                diffCount++;
            }
            if(diffCount==2){
                break;
            }
        }
        if(diffCount==0){
            return true;
        }
        for(int i=0;i<2;i++){//交换两个不同的字符的位置
            int index=diffIndex[i];
            sb1.setCharAt(index,diffChar[1-i]);
        }
        for(int i=0;i<sb1.length();i++){
            if(sb1.charAt(i)!=sb2.charAt(i)){
                return false;
            }
        }
        return true;
    }
}

2、1791. Find Center of Star Graph

难度:Medium

题目大意:

找无向图的中心节点。

思路:

中心节点和每个节点都有连接,所以找出表示边连接的数组中找出公共元素即可。

代码

class Solution {
    public int findCenter(int[][] edges) {
        int first=edges[0][0];
        int second=edges[0][1];
        int center=-1;
        for(int i=1;i<edges.length;i++){
            if(first==edges[i][0]||first==edges[i][1]){
                center=first;
                break;
            }
            center=second;
            break;
        }
        return center;
    }
}
 

3、1792. Maximum Average Pass Ratio

难度:Medium

题目大意:

给出一些班级的学生总数和能通过考试的学生人数,另外还有若干个学霸,这些学霸参加考试肯定能通过,将这些学霸分配到这些班级中,使得这些班级的平均考试通过率达到最高。

思路:

每次将一个学霸分配到对考试通过率提升最大的班级中去,用优先队列来寻找这样的班级。

代码

class Solution {
    public double maxAverageRatio(int[][] classes, int extraStudents) {
        Queue<double[]> pq=new PriorityQueue<>((a,b)->{
            double x=(a[0]+1)/(a[1]+1)-a[0]/a[1];//通过率的增量
            double y=(b[0]+1)/(b[1]+1)-b[0]/b[1];
            if(y>x){按通过率的增量从大到小排列
                return 1;
            }
            else if(y<x){
                return -1;
            }
            else{
                return 0;
            }
        });
        for(int[] c:classes){//一开始变量名不是用c而是用class,后来才发现class是关键字
            pq.offer(new double[]{c[0],c[1]});
        }
        while(extraStudents-->0){
            double[] c=pq.poll();
            pq.offer(new double[]{c[0]+1,c[1]+1});
        }
        double sum=0;
        while(!pq.isEmpty()){
            double[] c=pq.poll();
            sum+=c[0]/c[1];
        }
        return sum/classes.length;
    }
}

4、1793. Maximum Score of a Good Subarray

难度:Hard

题目大意:

详见题目,与Leetcode84类似。

思路

参考高赞回答,贪心思想,遍历子序列的长度1~n,每次长度增加时都尽可能地让最小值减少得少一些。

代码

class Solution {
    public int maximumScore(int[] nums, int k) {
        int n=nums.length;
        int left=k,right=k,mini=nums[k];
        int maxScore=nums[k];
        while(left>0||right<n-1){
            if(left==0){
                right++;
            }
            else if(right==n-1){
                left--;
            }
            else if(nums[left-1]<nums[right+1]){
                right++;
            }
            else{
                left--;
            }
            mini=Math.min(mini,Math.min(nums[left],nums[right]));
            int score=mini*(right-left+1);
            if(score>maxScore){
                maxScore=score;
            }
        }
        return maxScore;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值