【Leetcode】第 278 场周赛

简介: 第 278 场周赛是Leetcode上2021年最后一场周赛,也是我第一次参加的周赛,第一道题秒了,然后可能是自己肚子疼吧,第二题写完一直有bug,死活找不出来,一直被卡住。直到比赛结束后,吃完午饭,一下子就找到了bug,最后属实是把自己气笑了。

前言


第 278 场周赛是Leetcode上2021年最后一场周赛,也是我第一次参加的周赛,第一道题秒了,然后可能是自己肚子疼吧,第二题写完一直有bug,死活找不出来,一直被卡住。直到比赛结束后,吃完午饭,一下子就找到了bug,最后属实是把自己气笑了。


以后尽量每场周赛都会参加的,再接再厉,2022加油!


5993. 将找到的值乘以 2

第 278 场周赛第一题,是个简单题


题目展示

微信图片_20220521122306.png


题意解读

这个题目比较简单,题目意思是让我们在数组nums中找original这个数,找到之后把original翻倍继续找,直到找不到翻倍的数字为止。


解题思路

我们每次找到original之后都要把original翻倍,那么我们每次需要找的数字只会越来越大。


那么我们可以先给数组进行排序。在排序之后,每次在找到original之后,对于新的original如果存在的话,就肯定在数组中当前位置的后面,我们只需要接着往下找就行了,不需要回头再重新开始遍历数组了。


思路有了,那我们就来实现代码吧!


代码实现

class Solution {
    public int findFinalValue(int[] nums, int original) {
        Arrays.sort(nums);
        for(int i:nums){
            if(i==original){
                original*=2;
            }
        }
        return original;
    }
}



执行结果

image.png


5981. 分组得分最高的所有下标

第 278 场周赛第二题,是个中等


题目展示

微信图片_20220521122348.png


题目解读

给你一个数组,数组中元素不是1就是0,然后让我们把数组分成左右两部分。分法是按照数组的下标分,也包括i=0和i=n,即从数组任意两个元素之间包括第一个元素之前和最后一个元素之后。在分成两部分最后总计左半部分的0和右半部分的1的总数,并且记录下总数最大时候是在数组下标多少分的。有可能这个总数最大时候分法不唯一,所以最后以List形式返回。


解题思路

看到这个题,你可能会想建立两层循环,外层循环是每次分割数组的位置,内层循环是用来统计1与0总数的,然后在用哈希表来保存对应次数的分割位置,然后找到最大的key值,返回对应的value组成的list。听起来行如流水,一气呵成。


但是,并不可行。因为数组长度最大是可以到100000的,会超时的。(其实第一次就是这样写的,呜呜呜)


那我们换个思路在时间复杂度为O(n)时候解决掉。


我们是要知道每个分割位置的左边的0数与右边的1数之和分别是多少然后统计出最大的值所对应的所有下标的。


这个步骤其实我们在时间复杂度为O(n)内就可以解决。


我们先设立一个大小为数组nums大小加1的数组用来保存,每个分割位置所对应左0右1数总和。


我们先统计出来每个分割位置右边1的个数,这个我们使用一次循环就可以解决掉了。


知道右边1的数了,还差左边0的个数,那我们在进行一次遍历数组即可:


当nums数组当前位置为0的时候,那么以这个数字后面的这个分割位置对应的总数相比于前一个分割位置的总数就得加1


当nums数组当前位置为1的时候,那么以这个数字后面的这个分割位置对应的总数相比于前一个分割位置的总数就得减1


在这个过程中比较记录最大的总数是多少。


做后再遍历一遍记录的数组,把所有等于最大记录数字的下标保存在list中去。


思路ok了,我们接下来用代码来实现一下。


代码实现

class Solution {
    public List maxScoreIndices(int[] nums) {
        int len=nums.length;
        int[] ar = new int[len+1];
        for(int i : nums){
            if(i==1) ar[0]++;
        }
        int max = ar[0];
        for(int i=1 ;i<=len;i++){
            if(nums[i-1]==0) ar[i]=ar[i-1]+1;
            else ar[i]=ar[i-1]-1;
            if(ar[i]>max) max=ar[i];
        }
        List list= new ArrayList(); 
        for(int i=0 ;i
            if(ar[i]==max){
                list.add(i);
            }
        }
        return list;
    }
}



执行结果

image.png


结语

后两个题不会,哈哈哈



相关文章
|
4月前
|
Go
golang力扣leetcode 第 291 场周赛
golang力扣leetcode 第 291 场周赛
52 0
|
4月前
|
Go vr&ar
golang力扣leetcode 第 288 场周赛
golang力扣leetcode 第 288 场周赛
49 0
|
4月前
|
Go
golang力扣leetcode 第 286 场周赛
golang力扣leetcode 第 286 场周赛
50 0
|
11月前
|
算法 Android开发
LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
61 1
|
4月前
|
Go
golang力扣leetcode第 294 场周赛
golang力扣leetcode第 294 场周赛
47 0
|
4月前
|
算法 Java Go
golang力扣leetcode 第 293 场周赛
golang力扣leetcode 第 293 场周赛
76 0
|
4月前
|
Go
golang力扣leetcode 第 290 场周赛
golang力扣leetcode 第 290 场周赛
45 0
|
4月前
|
Go C++
golang力扣leetcode 第 284 场周赛
golang力扣leetcode 第 284 场周赛
53 0
|
4月前
|
存储
Leetcode第383场周赛
在LeetCode第383场周赛中,选手完成了3道题目。第一题是关于边界上的蚂蚁,蚂蚁根据非零整数数组nums的值移动,返回蚂蚁返回边界上的次数。解题方法是计算数组累加和为0的次数。第二题涉及计算网格的区域平均强度,给定一个灰度图像和阈值,返回每个像素所属区域的平均强度。解题关键在于理解相邻像素和区域定义,并计算平均强度。第三题是恢复单词初始状态的最短时间问题,通过移除前k个字符并添加k个字符,求恢复原词所需的最短时间。解题策略是检查去除前k个字符后的子串是否能作为原词的前缀。
27 1
Leetcode第383场周赛
|
4月前
|
Go
golang力扣leetcode 第 292 场周赛
golang力扣leetcode 第 292 场周赛
56 0