Leetcode Weekly Contest 238(详细解析)

题目链接: Leetcode Weekly Contest 238

写在前面:

本次只做出了第一道,第三道一直到比赛结束也没有做对。

1、1837. Sum of Digits in Base K

难度:Easy

题目大意:

将十进制数n转成k进制,然后返回k进制数每一位数字相加之和。

思路:

按题意模拟即可。

代码

class Solution {
    public int sumBase(int n, int k) {
        int res=0;
        while(n>0){
            int value=1;
            int count=0;
            while(value<=n){
                value*=k;
            }
            value/=k;
            int a=n/value;
            n-=a*value;
            res+=a;
        }
        return res;
    }
}

2、1838. Frequency of the Most Frequent Element

难度:Medium

题目大意:

给出一个数组,以及数字k,每次操作可以将数组汇总一个元素加一,最多可以进行k次操作,求最终数组中最多有几个相同的元素。

思路:

参考高赞回答,先将数组按升序排序,然后遍历每一个元素,假设数组中数目最多的元素就是当前遍历的元素,然后检查是否能将比它小的元素都变成它。采用滑动窗口。

代码

class Solution {
    public int maxFrequency(int[] nums, int k) {
        Arrays.sort(nums);
        int i=0;
        long sum=0;//用int会溢出
        int res=1;
        for(int j=0;j<nums.length;j++){
            sum+=nums[j];
            while(i<=j&&sum+k<(long)(nums[j]*(j-i+1))){
                //将所有的元素都变成nums[j],j-i+1为nums[j]可能的最多个数
                sum-=nums[i];
                i++;
            }
            res=Math.max(res,j-i+1);
        }
        return res;
    }
}

3、1839. Longest Substring Of All Vowels in Order

难度:Medium

题目大意:

详见题目。

思路:

参考高赞回答,遍历整个字符串,然后加入一些判断即可。

代码

class Solution {
    public int longestBeautifulSubstring(String word) {
        char[] s=word.toCharArray();
        int n=word.length();
        int res=0;
        int curLen=1;
        int unique=1;//不同字符的个数
        for(int i=1;i<n;i++){
            if(s[i]>s[i-1]){
                curLen++;
                unique++;
            }
            else if(s[i]==s[i-1]){
                curLen++;
            }
            else{
                curLen=1;
                unique=1;
            }
            if(unique==5){
                res=Math.max(res,curLen);
            }
        }
        return res;
    }
}

4、1840. Maximum Building Height

难度:Hard

题目大意:

详见题目。

思路

参考高赞回答,先根据题意求出有限制的位置的建筑物的最高高度是多少,然后求每两个相邻的有限制的位置中间建筑物的最高高度,最后取最大值即可。

代码

class Solution {
    public int maxBuilding(int n, int[][] restrictions) {
        int size=restrictions.length;
        int[][] arr=new int[size+2][2];
        for(int i=0;i<size;i++){
            arr[i]=restrictions[i];
        }
        arr[size]=new int[]{1,0};//坐标为1的建筑高度为0
        arr[size+1]=new int[]{n,n-1};//坐标为n的建筑高度最高位n-1
        Arrays.sort(arr,(a,b)->a[0]-b[0]);
        int len=arr.length;
        for(int i=1;i<len;i++){//从左到右计算每个位置建筑的最高高度
            arr[i][1]=Math.min(arr[i][1],arr[i-1][1]+(arr[i][0]-arr[i-1][0]));
        }
        for(int i=len-2;i>=0;i--){//从左到右计算每个位置建筑的最高高度
            arr[i][1]=Math.min(arr[i][1],arr[i+1][1]+(arr[i+1][0]-arr[i][0]));
        }
        int ans=0;
        for(int i=1;i<len;i++){
            int l=arr[i-1][0],r=arr[i][0];
            int h1=arr[i-1][1],h2=arr[i][1];
            ans=Math.max(ans,Math.max(h1,h2)+(r-l-Math.abs(h1-h2))/2);
            //Math.max(h1,h2)+(r-l-Math.abs(h1-h2))/2表示在坐标l和r之间楼层的最高高度
            //r-l表示在从l到r可以增加的高度,因为相邻的楼层高度相差不能超过1,所以每次最多将高度增加1
            //Math.abs(h1-h2)表示吧h1和h2变得一样高需要增加的高度,可以结合图形来理解
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值