持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
力扣第 312 场周赛
力扣第 312 场周赛-力扣
a了三题,2000以内,小上10几分。第三题有点离谱,给的例子太基础了,修改了代码之后根本试不出来对不对,错八次可真是,,,,不罚时的话能到1150名呢(当然只能想想)
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的时候慢了,排序还是差不多的。
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 <= 1051 <= 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)
第三题连接如下-找到所有好下标
[杨小白]_leetcode_力扣第 312 场周赛-第三题
第四题连接如下-2430. 对字母串可执行的最大删除数
[杨小白]_leetcode_力扣第 312 场周赛-第四题
3.结束
前两题都不难,基本100题量的同学就可以做出来了,就是第二题要看懂题目要求什么。第三题的话,,,有点坑。第四题还是无从下手,gogogo,刷题刷题,每天一道,三年1000道!!!!