[杨小白]_leetcode_力扣第 312 场周赛-第一、二题

129 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!

力扣第 312 场周赛

力扣第 312 场周赛-力扣

a了三题,2000以内,小上10几分。第三题有点离谱,给的例子太基础了,修改了代码之后根本试不出来对不对,错八次可真是,,,,不罚时的话能到1150名呢(当然只能想想)

image.png

2418. 按身高排序

给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。

对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。

请按身高 降序 顺序返回对应的名字数组 names 。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/so… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 1

输入:names = ["Mary","John","Emma"], heights = [180,165,170]

输出:["Mary","Emma","John"]

解释:Mary 最高,接着是 Emma 和 John 。

示例 2

输入:names = ["Alice","Bob","Bob"], heights = [155,185,150]

输出:["Bob","Alice","Bob"]

解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob 。

提示

n == names.length == heights.length

1 <= n <= 103

1 <= names[i].length <= 20

1 <= heights[i] <= 105

names[i] 由大小写英文字母组成

heights 中的所有值互不相同

代码

没什么难的,用一个queue然后自己写一个排序就可以了。

class Solution {
    public String[] sortPeople(String[] names, int[] heights) {
        String[] res = new String[names.length];
        PriorityQueue<Object[]> queue = new PriorityQueue<>((o1, o2) -> {
            return (Integer)o2[1] - (Integer)o1[1];
        });
        for (int i = 0; i < heights.length; i++) {
            queue.add(new Object[]{names[i],heights[i]});
        }
        int index = 0;
        while (!queue.isEmpty()) {
            res[index++] = (String) queue.poll()[0];
        }
        return res;
    }
}

算法的速度确实也不算快,看了下快的算法,就是自己写了一个快排,在排序身高的同时,也把姓名跟着交换位置。确实会快不少。这里主要是在加入queue的时候慢了,排序还是差不多的。

image.png

2419. 按位与最大的最长子数组

给你一个长度为 n 的整数数组 nums 。

考虑 nums 中进行 按位与(bitwise AND)运算得到的值 最大 的 非空 子数组。

换句话说,令 k 是 nums 任意 子数组执行按位与运算所能得到的最大值。那么,只需要考虑那些执行一次按位与运算后等于 k 的子数组。 返回满足要求的 最长 子数组的长度。

数组的按位与就是对数组中的所有数字进行按位与运算。

子数组 是数组中的一个连续元素序列。

示例 1

输入: nums = [1,2,3,3,2,2]

输出: 2

解释:

子数组按位与运算的最大值是 3 。

能得到此结果的最长子数组是 [3,3],所以返回 2 。

示例 2

输入: nums = [1,2,3,4]

输出: 1

解释:

子数组按位与运算的最大值是 4 。

能得到此结果的最长子数组是 [4],所以返回 1 。

提示

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 106

代码

真是出的一手好题,,,,第一遍看了几分钟没看懂要干嘛。半个小时做了第三题之后,回来看,一看,这不就是求连续等于max的最长长度吗。

因为‘与’操作只会让结果变小或者不变。那边数组中的max就是与操作的最大值咯。然后遍历数组找到连续等于max的最长长度返回即可。

class Solution {
    public int longestSubarray(int[] nums) {
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            max = Math.max(max,nums[i]);
        }
        int left = 0;
        int right = 0;
        int res = 0;
        while (right < nums.length) {
            if (nums[right] == max) {
                while (right < nums.length && nums[right] == max) {
                    right++;
                }
                res = Math.max(res, right - left);
            } else {
                right++;
            }
            left = right;
        }
        return res;
    }
}

速度不用说了,大家都大差不差,基本O(n)

image.png

第三题连接如下-找到所有好下标

[杨小白]_leetcode_力扣第 312 场周赛-第三题

第四题连接如下-2430. 对字母串可执行的最大删除数

[杨小白]_leetcode_力扣第 312 场周赛-第四题

3.结束

前两题都不难,基本100题量的同学就可以做出来了,就是第二题要看懂题目要求什么。第三题的话,,,有点坑。第四题还是无从下手,gogogo,刷题刷题,每天一道,三年1000道!!!!