Leetcode - 127双周赛

news2025/1/12 15:47:51

目录

一,3095. 或值至少 K 的最短子数组 I

二,3096. 得到更多分数的最少关卡数目

三,3097. 或值至少为 K 的最短子数组 II

四,3098. 求出所有子序列的能量和


一,3095. 或值至少 K 的最短子数组 I

本题需要知道一个知识点,0|0 = 0,0|1 = 1,1|1 = 1,根据上述性质可以得出,每按位或一个数,这个数要么变大,要么不变,也就是说它有一个非递减的性质。在者,这道题的数据范围不大,可以直接暴力,代码如下: 

class Solution {
    public int minimumSubarrayLength(int[] nums, int k) {
        int n = nums.length;
        int ans = Integer.MAX_VALUE;
        for(int i=0; i<n; i++){
            int or = 0;
            for(int j=i; j<n; j++){
                or |= nums[j];
                if(or >= k){
                    ans = Math.min(ans, j-i+1);
                    break;
                }
            }
        }
        return ans==Integer.MAX_VALUE?-1:ans;
    }
}

二,3096. 得到更多分数的最少关卡数目

本题实际上就是求前缀和大于后缀和的所需要的最小数量,需要先统计整个数组的和sum,再遍历数组possible,用一个额外变量pre统计它的前缀和,那么sum - pre就是它的后缀和,如果 pre > sum - pre,返回结果,代码如下:

class Solution {
    public int minimumLevels(int[] possible) {
        int sum = 0;
        for(int x : possible) 
            sum += x==0?-1:1;
        int n = possible.length;
        int pre = 0;
        for(int i=0; i<n; i++){
            if(i>0 && pre > sum - pre)
                return i;
            pre += possible[i]==0?-1:1;
        }
        return -1;
    }
}

三,3097. 或值至少为 K 的最短子数组 II

本题和第一题相同,但是数据范围更大,无法使用暴力,但是结论可以使用:一个数按位或的越多,那么就会变大或不变

方法一:滑动窗口

使用一个大小为32的数组来统计32个比特位各出现了几次

  • 每遍历到一个数,遍历它的32个bit位,如果cnt[i]==0 && (x>>i)&1==1时,说明当前数字按位或后,这个bit位会从0变成1,所以 k -= 1<<i
  • 当 k <= 0 时,说明当前按位与的数已经大于k了,就可以更新ans,同时可以缩减[l,r]的范围,看看当l变大时,是否满足k<=0,注意删除nums[l]时,遍历它的32个bit位,如果cnt[i]==1 && ((nums[l]>>i)&1)==1,说明删除这个数后,按位或的这个数会减小,所以 k += 1<<i
  • 注意当 k == 0 时,直接返回 1
class Solution {
    public int minimumSubarrayLength(int[] nums, int k) {
        int[] cnt = new int[32];//统计bit位出现了几次
        int n = nums.length;
        int ans = Integer.MAX_VALUE;
        if(k == 0) return 1;
        for(int l=0,r=0; r<n; r++){
            int x = nums[r];
            for(int i=0; i<32; i++){
                if(cnt[i]==0 && ((x>>i)&1)==1)//按位或之后,这个bit位会从0变成1
                    k -= 1<<i;
                cnt[i] += (x>>i)&1;
            }
            while(k <= 0){
                ans = Math.min(ans, r-l+1);//跟新答案
                int y = nums[l];
                for(int i=0; i<32; i++){
                    if(cnt[i]==1 && ((y>>i)&1)==1)//丢掉y之后,这个bit位是否会从1变成0
                        k += 1<<i;
                    cnt[i] -= (y>>i)&1;
                }
                l++;
            }
        }
        return ans==Integer.MAX_VALUE?-1:ans;
    }
}

方法二:通用模板

遍历数组nums,使用二维数组不停的更新以 i 为右端点的按位或值,及其最大左端点,同时计算符合条件的最短子数组

class Solution {
    public int minimumSubarrayLength(int[] nums, int k) {
        int ans = Integer.MAX_VALUE;
        int[][] or = new int[32][2];
        int m = 0;
        int n = nums.length;
        for(int i=0; i<n; i++){
            or[m][0] = 0;
            or[m++][1] = i;
            //更新操作
            int j = 0;
            for(int idx=0; idx < m; idx++){
                or[idx][0] |= nums[i];
                if(or[idx][0] >= k){
                    ans = Math.min(ans, i-or[idx][1]+1);
                }
                if(or[idx][0] != or[j][0])//去重
                    or[++j][0] = or[idx][0];
                or[j][1] = or[idx][1];
            }
            m = j+1;
        }
        return ans == Integer.MAX_VALUE ? -1 : ans;
    }
}

四,3098. 求出所有子序列的能量和

本题是一道单纯的dfs+记忆化题,有两种做法:

  • 枚举选哪个
  • 选或不选

枚举选哪个:

class Solution {
    static final int MOD = (int)1e9+7;
    int[] nums;
    int n;
    Map<Long, Long> map = new HashMap<>();
    public int sumOfPowers(int[] nums, int k) {
        this.nums = nums;
        Arrays.sort(nums);
        this.n = nums.length;
        long ans = dfs(0,k,Integer.MAX_VALUE, -1);
        return (int)ans%MOD;
    }
    long dfs(int idx, int k, int min, int j){
        if(k == 0){
            return min;
        }
        long res = 0;
        long key = ((long)min<<18|idx<<12|k<<6|(j+1));
        if(map.containsKey(key)) return map.get(key);
        for(int i=idx; i<=n-k; i++){
            res = (res + dfs(i+1, k-1, Math.min(min, (j==-1?Integer.MAX_VALUE:Math.abs(nums[i]-nums[j]))), i))%MOD;
        }
        map.put(key, res);
        return res;
    }
}

 选或不选:

class Solution {
    static final int MOD = (int)1e9+7;
    int[] nums;
    int n;
    Map<Long, Long> map = new HashMap<>();
    public int sumOfPowers(int[] nums, int k) {
        this.nums = nums;
        Arrays.sort(nums);
        this.n = nums.length;
        long ans = dfs(-1,k,Integer.MAX_VALUE, -1);
        return (int)ans%MOD;
    }
    //选或不选
    long dfs(int i, int k, int min, int j){
        if(k == 0)
            return min;
        if(k > n - i - 1)
            return 0;
        long res = 0;
        long key = ((long)min<<18|i<<12|k<<6|(j+1));
        if(map.containsKey(key)) return map.get(key);
        //选nums[i+1]
        res = dfs(i+1, k-1, Math.min(min, (j==-1?Integer.MAX_VALUE:Math.abs(nums[i+1]-nums[j]))), i+1);
        //不选nums[i+1]
        res += dfs(i+1, k, min, j);
        map.put(key, res%MOD);
        return res%MOD;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1570152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

武汉星起航电子商务有限公司挂牌展示,为合作伙伴提供全方位支持

随着跨境电商领域市场竞争愈演愈烈&#xff0c;武汉星起航亚马逊一站式孵化平台悄然崭露头角。从2017年起&#xff0c;武汉星起航便立足亚马逊自营店铺&#xff0c;积累了丰富的实战运营经验。2020年正式成立后&#xff0c;公司以跨境电商为核心&#xff0c;凭借专业的运营团队…

复杂度的讲解

1.算法效率 如何衡量一个算法的好坏&#xff1f;从两个维度&#xff0c;时间和空间&#xff08;算法运行的快慢&#xff0c;消耗的空间大不大&#xff09;。因为计算机硬件领域的高速发展&#xff0c;如今计算机的存储量已经达到了一个很高的程度&#xff0c;所以现在我们一般…

12种常见的软件架构风格

什么是软件架构&#xff1f; 软件架构是定义软件系统的高级结构和组织的过程。它涉及识别和选择正确的组件&#xff0c;决定它们之间如何交互&#xff0c;以及确定它们应该如何组织以实现特定的目标。软件架构的目标是创建一个可维护、可扩展和安全的系统&#xff0c;能够满足…

车载电子电器架构 —— 软件下载

车载电子电器架构 —— 软件下载 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无…

【Qt】:常用控件(三:按钮类)

常用控件&#xff08;三&#xff09; 一.Push Button二.Radio Buttion三.Check Box 一.Push Button 使⽤ QPushButton 表⽰⼀个按钮.这也是当前我们最熟悉的⼀个控件了.QPushButton继承⾃QAbstractButton .这个类是⼀个抽象类.是其他按钮的⽗类. QAbstractButton 中,和 QPushBu…

基于java+SpringBoot+Vue的网上订餐系统设计与实现

基于javaSpringBootVue的网上订餐系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot JSP工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 菜品浏览与选择&#xff1a;用户可以浏览不同的菜品分类&#xff0c;并选择心仪的菜品。 订单创建与管理&…

做抖店的新手朋友!别再盲目跟风个人店了!开通完根本做不起来!

哈喽~我是电商月月 想做抖音小店的朋友们一定要分清个人店和个体店的区别 个人店铺的限制真的太多了&#xff01;真的不好做&#xff01; 一&#xff0e;首先我们要知道两种的区别 个人店不需要营业执照&#xff0c;身份证就能开启 个体店则需要办理营业执照【营业执照的办…

设计模式——建造者模式03

工厂模式注重直接生产一个对象&#xff0c;而建造者模式 注重一个复杂对象是如何组成的&#xff08;过程&#xff09;&#xff0c;在生产每个组件时&#xff0c;满足单一原则&#xff0c;实现了业务拆分。 设计模式&#xff0c;一定要敲代码理解 组件抽象 public interface …

算法设计与分析实验报告c++实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 编…

JDI LCD 驱动时序介绍

1. 引言 绝大多数 STM32 MCU 都可应用于图形界面&#xff0c;而且很多系列还内置图形硬件 LTDC&#xff0c;支持驱动 RGB 接口的 LCD。但是存在少数类型的 LCD&#xff0c;如 JDI 屏&#xff0c;除了 STM32L4P5 支持外&#xff0c;其它 MCU 只能根据屏的接口时序要求&#xff…

DNS和HTTP

DNS应用层协议 域名解析系统 使用IP地址&#xff0c;来描述设备在网络上的位置 IP地址并不适合来进行传播网站&#xff0c;就采用了域名的方式来解决网站传播的问题。如www.baidu.com这样类似的就很容易让人记住。其域名就直接代表了这个网站。而且有一套自动的系统会将域名解…

LeetCode 2192.有向无环图中一个节点的所有祖先:拓扑排序

【LetMeFly】2192.有向无环图中一个节点的所有祖先&#xff1a;拓扑排序 力扣题目链接&#xff1a;https://leetcode.cn/problems/all-ancestors-of-a-node-in-a-directed-acyclic-graph/ 给你一个正整数 n &#xff0c;它表示一个 有向无环图 中节点的数目&#xff0c;节点编…

AFCI 应用笔记二之数据采集

1. 简介 基于监督学习的神经网络算法需要大量数据作为输入&#xff0c;模型完全由数据驱动&#xff0c;其数据质量是算法有效的必要条件&#xff0c;所以如何高效的采集到数据&#xff0c;以及正确的标注或分析是极其重要的&#xff0c;如果第一步有问题&#xff0c;后续的所有…

如何删除 iPhone 上的 iCloud 激活锁

Apple 在 iPhone 上通过不同的安全屏障来保护您的数据。 iCloud 激活锁可阻止外部人员访问您的手机。您可以通过打开“查找我的 iPhone”功能来激活此锁。 使用安全协议似乎是无害的&#xff0c;直到你到达门的另一边。如果您购买了带有激活锁的二手 iPhone 或忘记了 iCloud 凭…

eBay买家号注册下单容易死号?是什么原因导致?

随着电子商务的迅猛发展&#xff0c;跨境电商平台eBay日益成为众多消费者和商家的首选。然而&#xff0c;自去年下半年以来&#xff0c;eBay推出的新规则给买家号的注册带来了前所未有的挑战。许多新用户反映&#xff0c;在注册eBay买家号后&#xff0c;往往遭遇刚注册就被冻结…

哈希表2s总结

3.哈希表 哈希表非常常用&#xff0c;字典一般会用来保存处理过后的输入输出信息&#xff0c;集合也可以用来去重&#xff0c;这部分是重点&#xff0c;但是还是那句话&#xff0c;这种题目是不会或者说很少考原题的&#xff0c;主要还是学习知识&#xff0c;所以题目看一下答…

JS详解-手写Promise!!!

前言&#xff1a; 针对js的深入理解&#xff0c;作者学习并撰写以下文章&#xff0c;由于理解认知有限难免存在偏差&#xff0c;请大家指正&#xff01;所有定义来自mdn。 Promise介绍&#xff1a; 对象表示异步操作最终的完成&#xff08;或失败&#xff09;以及其结果值. 描…

基于SpringBoot+Vue光影视频平台(源码+部署说明+演示视频+源码介绍)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

ChernoCPP 2

视频链接&#xff1a;【62】【Cherno C】【中字】C的线程_哔哩哔哩_bilibili 参考文章&#xff1a;TheChernoCppTutorial_the cherno-CSDN博客 Cherno的C教学视频笔记&#xff08;已完结&#xff09; - 知乎 (zhihu.com) C 的线程 #include<iostream> #include<th…

SV学习笔记(六)

覆盖率类型 写在前面 覆盖率是 衡量设计验证完备性 的一个通用词。随着测试逐步覆盖各种合理的场景&#xff0c;仿真过程会慢慢勾画出你的设计情况。覆盖率工具会 在仿真过程中收集信息 &#xff0c;然后进行后续处理并且得到覆盖率报告。通过这个报告找出覆盖之外的盲区&…