【LeetCode每日一题】2024年9月第二周(上)

news2024/11/20 6:17:51

 2024.9.9 中等  难度评分 1333

链接:2181. 合并零之间的节点

(1)题目描述:

(2)示例

(3)分析

        整体来说,描述还算清晰的题目,找到0节点所框定的区域,进行加和即可。

        思路:从0开始逐个遍历所有节点,进行加和,如果存在0节点,结束本次加和,开启新节点再次加和。(如下,但此代码非常不规范,只作为思维描述)

//代码思路。当然这么写肯定不规范
    public ListNode mergeNodes(ListNode head) {
        ListNode node = new ListNode();
        while (head.next != null) {
            while (head.next.val != 0) {
                head = head.next;
                node.val += head.val;
            }
            node.next = node;
        }
        return node;
    }

        注意,在链表中,node本身不断变化的 node.next = node,最终指向的,是它的尾节点,是不符合要求的。所以最好新建一个ListNode,next指向node,或者:两者同时指向一个对象。具体如下

(4)代码

class Solution9_9_1 {
    public ListNode mergeNodes(ListNode head) {
        ListNode node = new ListNode();
        ListNode result = new ListNode();
        result.next=node;
        //优化后:
//        ListNode result = new ListNode();
//        ListNode node =result;
//        ListNode node = dummy; 并不会改变 dummy 本身的值,
//        而是让 node 和 dummy 都引用同一个对象。
//        通过 node 修改对象的属性(例如 node.next),
//        dummy 也会“看到”这些修改,因为它们指向同一个对象。
        ListNode head1 = head.next;//去除头节点
        int sum = 0;//统计结果。
        while (head1 != null) {
            if (head1.val == 0)//创建新节点
            {
                node.next = new ListNode(sum);
                node = node.next;// 移动到下一个节点
                sum = 0;// 重置累加器
            } else {
                sum += head1.val;//累加
            }
            head1 = head1.next;//移动到下一个节点
        }
//        return node; 这里有个易错点,直接返回node,在循环中,
//        node本身不断变化 node = node.next,最终指向的,是它的尾节点,是不符合要求的。
//        所以最好新建一个ListNode,next指向node,
        return result.next.next;//因为我们写的,开头会默认两个0节点,所以两个next
//      优化后:
//      return result.next;

    }
}

(5)碎碎念

其实,还是说,对链表这种不太熟悉,有时总会忘记他循环的特性,直接用,老是报错。

 2024.9.10 困难  难度评分 2433

链接:2552. 统计上升四元组

(1)题目描述:

(2)示例

(3)分析

        题目越短,事儿越大。依据题目要求,这次给我们的实际上找一个:满足”波浪式“的四个元素:小小   大    小    大大,最大值在最右侧。很明显,最大值的存在必须在第3位之后,所以我们不妨拿出最大值。

        观察 “波浪式” 数据:2个数大小定后,再加一位定三元组,再加后定四元组。而这个过程是类似的,于是可以抽象出来:

(1)满足2元组【小,大】后,判断大和接下来值大小,

        ① 如果大,此前所有二元组皆可换为三元组,(指:大 > 接下来的值)

        ② 如果小,很难直接决定

(2)满足三元组【小小 大 小】后,判断大和接下来值大小

        ① 如果大,很难直接决定

        ② 如果小,二元组备选量+1,此前所有三元组皆可换为四元组

大家一定注意:题目中所有数字皆不同,并且我们发现,通过右侧和下一个值的比对,我们可以确定的,分别是对二元组、三元组的确定。但同时我么知道:每一个组得到皆有前一个获得,或间接决定。(这是我的一开始思路,但没写出来,直接复制灵神的了。)

(4)代码

class Solution {
    public long countQuadruplets(int[] nums) {
        long cnt4 = 0;
        int[] cnt3 = new int[nums.length];
        for (int l = 2; l < nums.length; l++) {
            // l从2开始,是为了算上开头三个就符合排序的
            // 外层循环:作为四元组中的第四个元素,遍历数组的每一个可能位置
            int cnt2 = 0;
            for (int j = 0; j < l; j++) {
                // 内层循环:j 从 0 开始到 l-1,
                //对于每一个 l,通过 j 遍历之前的元素,尝试找到符合条件的三元组 (i, j, k)。
                // cnt2:用于计数在当前循环中,满足 nums[i] < nums[k] 的二元组的数量。
                //每当发现一个这样的组合时,它将帮助更新 cnt3[j]。
                if (nums[j] < nums[l]) { 
                    // 3 < 4,当接下来的符合时,直接把全部的三元组的数量加和到,就是符合条件的四元组
                    cnt4 += cnt3[j];
                    // 把 j 当作 i,把 l 当作 k,现在 nums[i] < nums[k],即 1 < 2
                    cnt2++;
                } else {
                    // 如果 nums[j] > nums[l],则表示 j 可以成为四元组中第2大的元素,
                    // 因此将 cnt2(当前符合 nums[i] < nums[k] 的二元组数量)累加到 cnt3[j] 中,表示形成了新的三元组。
                    cnt3[j] += cnt2;
                }
            }
        }
        return cnt4;
    }
}

(5)碎碎念

有些抽象的……,花了非常多的时间。

 2024.9.11 中等  难度评分 2081

链接:2555. 两个线段获得的最多奖品

(1)题目描述:

(2)示例

(3)分析

        首先呢,做一个解释:x轴上放了一些奖品,现在把放奖品的坐标告诉我们了,并且是2个间段内获得奖品,那么:只要两个间段大于奖品区间大小,即可全部获得。

        接下来,逐步判断即可,因为给的是坐标,所以,差值不大于k,即可包揽。

        于是:prizePositions[i]-prizePositions[0]>k为临界点,此时最大获得为i个, 这是第一次判断,但判断的不只是以0来判断,换为标识符start ,最大获得为:i-start,但为了下一次循环,strat得++。那么,很显然i-start+1 为当此获得的最大个数(已经++了),我们需要一个值来存储它。最后,sum就由:sum本身或(i-start+1 + 和距他k单位统计的值 )的最大值来决定。

(4)代码

class Solution {
    public int maximizeWin(int[] prizePositions, int k) {
        int len=prizePositions.length;
        //做一个解释:x轴上放了一些奖品,现在把放奖品的坐标告诉我们了,并且是2个间段内获得奖品
        //那么:只要两个间段大于奖品区间大小,即可全部获得。
        if(2*k>prizePositions[len-1]-prizePositions[0]){
            return len;
        }
        //接下来,是逐步判断,可取得奖品的条件是:长度小于等于k内的,
        //因为给的是坐标,所以,差值即可,差值不大于k,即可包揽.
        int sum=0;
        int start=0;
        int[] getTotall=new int[len+1];
        for(int i=0;i<len;i++){
        // 于是:prizePositions[i]-prizePositions[0]>k为临界点,此时最大获得为i个,
        // 这是第一次判断,但判断的不只是以0来判断,换为标识符start ==》 最大获得为:i-start,但为了下一次循环,strat得++
        // 于是:i-start+1 为当此获得的最大个数,我们需要来存储它。getTotall就是,
        // 那么,sum就由:sum本身或(i-start+1 + 和距他k单位统计的值 )的最大值 来决定

        // start指定这是哪一次,
            while(prizePositions[i]-prizePositions[start]>k){
                start++;
            }
            sum = Math.max(sum,getTotall[start]+i-start+1);
            getTotall[i+1] = Math.max(getTotall[i],i-start+1);
        }
        return sum;


    }
}

(5)碎碎念

这几天,写的都有些折磨……

 2024.9.12 中等  难度评分 1843

链接:2576. 求出最多标记下标

(1)题目描述:

(2)示例

(3)分析

        根据题目:我们返回的并非是标注的下标,而是数目。涉及到大小比较,所以对数据进行排序比较好,排好序后,便可对其拆分区域。

         一个len长度的数组,最少比对len/2次。其中,最多表记数为len。

        我们举个例子:2 3 5 7 11 16,要想最大,就需要拆开划分一半低,一般高用于被比对。

        在比较时,很明显,最优的情况,第一位 和 第(len/2+1)位比对,然后依次判断。

(4)代码

class Solution {
    //我们返回的并非是标注的下标,而是数目。涉及到大小比较,所以对数据进行排序比较好
    public int maxNumOfMarkedIndices(int[] nums) {
        Arrays.sort(nums);
        int len=nums.length;
        int sum=0;
        // 一个len长度的数组,最少比对len/2次。其中,最多表记数为len
        //我们举个例子:2 3 5 7 11 16,要想最大,就需要拆开划分一半低,一般高用于被比对。
        //在比较时,很明显,最优的情况,第一位 和 第(len/2+1)位比对,然后依次判断。
        int right= len/2;
        int left = 0;
       while (left <len/2 && right<len) {
                if (2*nums[left]<=nums[right]){
                    sum+=2;
                    left++;
                }                
                right++;
        }
        return sum;
    }
}

(5)碎碎念

这个还行,没费太多时间。

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

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

相关文章

起重机检测系统源码分享

起重机检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

@Valid @NotBlank @NotEmpty @NotNull不生效问题

Spring Boot2.3版本将不再内部依赖validator了 所以导致校验的注解不生效 解决方案&#xff1a;加入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency&…

C++提高--模板(类模板/函数模板)

模板的概念 函数模板(将类型参数化) 函数模板语法 两个函数逻辑非常相似 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; // 模板// 交换两个数 void swapInt(int& a, int& b) {int temp a;a b;b temp; } void swapDouble(doubl…

力扣121-买卖股票的最佳时机(Java详细题解)

题目链接&#xff1a;121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。…

踩最深的坑,教会自己找到需求

目录 引言 1. 寻找合适的需求 2. 海外市场选择 3. 线下热点判断 4. 线上关注度分析 5. 当前竞争分析 6. 未来潜力分析 引言 在经历了刻骨铭心的合伙创业经历后&#xff0c;我意识到是时候该独立出海了。 捡起早已深埋在心里的创业想法&#xff0c;开始独自创业。 这次…

用“女神的一群舔狗”的例子深入理解线程池

假如有一个妹子&#xff08;肤白貌美身材好&#xff09; 同一时间只能谈一个对象&#xff0c;但是新鲜感过去之后就没什么意思了&#xff0c;就想换个对象&#xff0c;但是更换对象的操作效率比较低&#xff0c;需要做到&#xff1a; 1. 想办法和现有对象分手 2.吸引到下一个舔…

高低压配电系统中电弧光的危害有多大?

摘要 故障电弧是一种常见的电气故障现象&#xff0c;尤其在配电系统中&#xff0c;可能对设备安全和电力供应造成严重影响。本文旨在探讨故障电弧对配电系统的危害&#xff0c;并提出相应的预防措施&#xff0c;以增强系统的可靠性和安全性。通过对故障电弧的形成机制、危害分…

软件设计师试题

1、以下关于RISC&#xff08;精简指令集计算机&#xff09;特点的叙述中&#xff0c;错误的是&#xff08; B &#xff09;。 A.对存储器操作进行限制&#xff0c;使控制简单化 B.指令种类多&#xff0c;指令功能强 C.设置大量通用寄存器 D.选取使用频率较高的一些指令&…

利用Python快速提取字体子集

来自&#xff1a;Python大数据分析 费弗里 在我们日常进行数据可视化、web应用开发等场景中&#xff0c;经常会用到一些特殊的非系统自带字体&#xff0c;尤其是中文字体&#xff0c;由于包含的字符数量众多&#xff0c;因此体积一般都比较大&#xff0c;这在进行数据可视化读取…

C++当中的继承

在C当中继承是一个非常重要的语法。我们可以使用继承快速的进行代码的复用以及对代码进行扩展操作。首先我们来进行学习继承的基本语法。 &#xff08;一&#xff09;继承的语法方式 还记得我们之前学习的访问限定符吗&#xff1f;就是class里面的private&#xff0c;public&am…

直播间没有自然流,如何突破?

如果你的直播间完全没有自然流量&#xff0c;不用担心&#xff0c;有四种方法可以解决这个问题。 第一种方法是延长直播时长。如今的账号系统与以前不同&#xff0c;现在自然流量非常珍贵。以前&#xff0c;新账号即使没有数据&#xff0c;平台也会给一些流量&#xff0c;但现在…

校园管理新篇章:Spring Boot系统实现策略

第3章 系统分析 3.1 需求分析 校园管理系统主要是为了提高用户的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系…

jmeter设置全局token

1、创建setup线程&#xff0c;获取token的接口在所有线程中优先执行&#xff0c;确保后续线程可以拿到token 2、添加配置原件-Http信息头管理器&#xff0c;添加取样器-http请求 配置好接口路径&#xff0c;端口&#xff0c;前端传参数据&#xff0c;调试一下&#xff0c;保证获…

2024社群空间站全自动付费进群系统九块九进群源码

多种玩法&#xff1a;付费VIP玩法、同城行业群裂变玩法、全民K歌群裂变玩法、拼多多群玩法、VIP领取百度网盘资料玩法、单群付费玩法;

WTL580-电子锁微波雷达应用解决方案,5.8GHz精准人体感知,触发高效交互新体验

一、简介 随着智能电子门锁普及&#xff0c;电子门锁的市场也随着打开&#xff0c;安装智能化电子门锁也为大势所趋。现我司推出基于WTL580微波雷达的电子锁应用方案&#xff0c;通过检测门锁周围是有活动人体存在来激活门锁。我司WTL580微波雷达方案采用5.8GHz微米波雷达传感器…

mac系统安装最新(截止2024.9.13)Oracle JDK操作记录

文章目录 下载JDK22配置环境变量验证环境变量是否生效整体命令如下 下载JDK22 打开最新版Oracle JDK下载地址 选择想要安装的JDK版本&#xff0c;然后选择适合兼容Mac机器的版本&#xff08;Intel/arm&#xff09;&#xff0c;建议直接下载安装程序&#xff0c;可视化安装 默…

栈的定义和基本操作的实现

写代码&#xff1a;定义顺序存储的栈&#xff08;数组实现&#xff09;&#xff0c;数据元素是 int 型 写代码&#xff1a;基于上述定义&#xff0c;实现“出栈、入栈、判空、判满”四个基本操作 写代码&#xff1a;定义链式存储的栈&#xff08;单链表实现&#xff09; 写代…

零钱兑换二维dp实现(力扣--动态规划)

文章目录 1.题目描述2.解题思路3.代码实现 1.题目描述 题目链接&#xff1a;零钱兑换 2.解题思路 1.确定二维dp[i][j]的含义&#xff1a; dp[i][j] 前i个物品任取&#xff0c;装入容量为j的背包种&#xff0c;最少的硬币个数是dp[i][j] 2.确定递推公式&#xff1a; dp[i][j]…

【日语学习必备】5款超准实时翻译软件,让你的网课不再有障碍!

日语水平不过关&#xff0c;没办法实时听懂日语会议或日语网课内容怎么办&#xff1f; 两种方法&#xff01; 一、利用日语实时翻译软件&#xff0c;也就是所谓同声传译的方式实时将日语转换为中文 二、先将会议或网课等内容录制下来&#xff0c;再借助语音或视频翻译软件&am…

利士策分享,探索无界:心灵之旅,发现未知精彩

利士策分享&#xff0c;探索无界&#xff1a;心灵之旅&#xff0c;发现未知精彩 梦想的种子&#xff0c;在心田生根发芽 正如每一颗种子都蕴含着生命的奥秘&#xff0c;每个人心中那颗探索的种子&#xff0c;也藏着对未知世界的渴望与追求。它告诉我们&#xff0c;成长不仅仅…