算法之路(二)

news2025/3/13 10:31:15

🖊作者 : D. Star.
📘专栏 : 算法小能手
😆今日分享 : 你知道北极熊的皮肤是什么颜色的吗?(文章结尾有答案哦!)在这里插入图片描述

文章目录

  • 力扣的209题
    • ✔解题思路
    • ✔代码:
    • ✔总结:
  • 力扣的3题
    • ✔解题思路:
    • ✔代码:
    • ✔总结:
  • 力扣的1004题
    • ✔解题思路:
    • ✔代码:
    • ✔总结:
  • 力扣的1658题
    • ✔做题思路:
    • ✔代码:
    • ✔总结:
    • 感谢家人的阅读,不准确的地方 欢迎在评论区指正!

力扣的209题

做题链接209

✔解题思路

先用左右指针(left , right),从最左边开始找,右指针先动

  1. 利用单调性:当你找到第一个 >=target 时,右指针就不用再向右边找了,因为我们要找的是最短的子数组,再向右的子数组肯定是比第一次找到的长。
  2. 移动左指针,在原来的和的基础上,减去前一个左指针的值(left<right),找到和 >=target 的子数组长度,如果比之前的子数组长度短,就覆盖。
  3. 细节问题:符合长度的子数组 len 初始值赋多少?由于不清楚输入数组的长度,并且万一没有符合条件的子数组,返回的值就会出错。所以建议赋值整型的最大值 Integer.MAX_VALUES

✔代码:

    public static int minSubArrayLen2(int target, int[] nums) {
        int n = nums.length,sum = 0,len = Integer.MAX_VALUE;
        for(int left = 0,right = 0;right<n;right++){
            sum+=nums[right];
            while (sum>=target){
                len = Math.min(len,right-left+1);
                sum-=nums[left++];
            }
        }
        return len == Integer.MAX_VALUE?0:len;
    }

✔总结:

  1. 没注意到或者说是没有理解题目中的连续子数组 这个字眼,上来就sort()了
  2. 我的做法是找到最大的数字,然后在他的左边和右边开始找长度最小的子数组,但是后来发现行不通。
  3. 正确做法:用滑动窗口,“同向双指针”。

力扣的3题

做题链接:力扣3题

✔解题思路:

将字符串转化为字符数组。用数组代换Hash表。int[] hash = new int[128];//这里的128刚好囊括了所有阿斯克码值(0-127)。
先入窗口,然后判断,若符合判断,则出窗口,不符合则得出结果,最后循环更新结果。

✔代码:

    public static int lengthOfLongestSubstring2(String ss) {
        char[] s = ss.toCharArray();
        //用数组代换Hash表
        int[] hash = new int[128];//这里的128刚好囊括了所有阿斯克码值(0-127)
        int right = 0, left = 0, ret = 0;
        while (right < s.length) {
            hash[s[right]]++;//让s[right]所在的阿斯克码值+1----入窗口
            while (hash[s[right]] > 1) {//说明该字母已存在
                hash[s[left++]]--;//让s[left++]所在的阿斯克码值-1----窗口
            }
            ret = Math.max(ret,right-left+1);
            right++;
        }
        return ret;
    }

✔总结:

这题用到了Hash表的思想,用数组代替阿斯克码值,很巧妙。

力扣的1004题

做题链接:力扣1004题

✔解题思路:

  1. right先进窗口,如果是1,跳过;如果是0,k–。
  2. 判断k的值,如果k值<0,则遇0无法再翻牌子
  3. 则出窗口,left++;遇到1,无视;遇到0,k++;
  4. 得出结果,更新结果

✔代码:

       public static int longestOnes2(int[] nums, int k) {
        int n = nums.length, kk = k, left = 0, right = 0, len = 0;
        while (right < n) {
            //先进窗口
            if (nums[right] == 0) {
                kk--;
                right++;
            }
            else right++;
            //判断kk的值
            while (kk < 0) {
                if (nums[left++] == 0) kk++;
            }
            //计算长度
            len = Math.max(len, right - left);
        }
        return len;
    }

✔总结:

这题写的时候有点迷糊,没想到这种方法,老师刚讲的时候,还感觉挺懵的,但是细想也挺简单的,就像是求俩数之和一样,要使得k>=0才行。这题还是需要多复盘一下的!!!

力扣的1658题

做题链接力扣1658

✔做题思路:

重要思路:正难则反

  1. 计算出整个数组sum 的值和target (代表窗口里的和sum-x)的值
  2. 进窗口【并计算出窗口内tmp的值】
  3. 判断tmptarget 的关系【>则left++;<则right++;=则计算len】
  4. 出窗口:就是上面的【>则left++】
  5. 更新结果:就是上面的【=则计算len】

✔代码:

   public static int minOperations(int[] nums, int x) {
        //1. 计算出整个数组sum的值和target(代表窗口里面的和sum-x)的值
        int sum = 0;
        for (int i : nums) sum += i;
        int target = sum - x;
        //细节:
        //如果target<0(即x>sum),则直接返回-1
        if(target<0) return -1;
        //2. 进窗口
        int left = 0, right = 0, tmp = 0, len = -1;
        //这里长度len设为-1,有两个好处:
        // 1. 题目要求没有符合条件的就返回-1。
        // 2.最后可以判断,如果len是-1,则直接返回-1,否则返回num.length。
        while (right < nums.length) {
            tmp += nums[right];
            //3. 判断窗口里面的值
            while (tmp > target) {
                //大于target,[left++]
                //4. 出窗口
                tmp -= nums[left++];
            }
            if (tmp == target) {
                // 等于target,计算窗口长度
                //5. 更新长度
                len = Math.max(len, right - left+1);
            }
            // 小于target,right++
            //6. 进窗口
            right++;
        }
        if(len == -1) return len;
        return nums.length-len;
    }

✔总结:

这题刚开始的时候,理解错题目意思了,我上来就给数组排序,然后总有一些例子过不去,后来知道了题目的意思,是在原来的顺序上进行移动,但是无从下手。看了老师的解题步骤和思路,觉得很精妙!

答案:北极熊的皮肤是黑色的!我也是今天才知道…涨知识了~


感谢家人的阅读,不准确的地方 欢迎在评论区指正!

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

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

相关文章

变频器干扰PLC,我们是这么解决的……

PLC是变频器的上位机&#xff0c;但是&#xff0c;在很多工程现场中&#xff0c;经常也会出现这样的问题&#xff0c;就是变频器开始运行后&#xff0c;PLC就开始罢工了&#xff0c;有的时候死机&#xff0c;有的时候指令传达不畅&#xff0c;有的时候会出现通讯时断时续等等&a…

【【VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 】】

VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 VDMA彩条显示实验之三 之 RGB LCD 彩条显示实验 LCD 的构造是在两片平行的玻璃基板当中放置液晶盒&#xff0c;下基板玻璃上设置 TFT&#xff08;薄膜晶体管&#xff09;&#xff0c;上基板玻璃上设置彩色滤光片&#xff0c;通…

Asp.net MVC Api项目搭建

整个解决方案按照分层思想来划分不同功能模块&#xff0c;以提供User服务的Api为需求&#xff0c;各个层次的具体实现如下所示&#xff1a; 1、新建数据库User表 数据库使用SQLExpress版本&#xff0c;表的定义如下所示&#xff1a; CREATE TABLE [dbo].[User] ([Id] …

MISRA 2012学习笔记(5)-Rules 8.10

文章目录 Rules8.10 基本类型模型(The essential type model)8.10.1 原理8.10.2 基本类型(Essential type)Rule 10.1 操作数不得具有不适当的基本类型Rule 10.2 在加减法运算中&#xff0c;不得不当使用本质为字符类型的表达式Rule 10.3 表达式的值不得赋值给具有较窄基本类型或…

软考小记-软件工程

模块的控制范围包括模块本身及其所有的从属模块。模块的作用范围是指模块一个判定的作用范围&#xff0c;凡是受这个判定影响的所有模块都属于这个判定的作用范围.&#xff0c;原则上一个模块的作用范围应该在其控制范围之内&#xff0c;若没有&#xff0c;则可以将判定所在模块…

云课五分钟-0B快速排序C++示例代码-注释和编译指令

前篇&#xff1a; 云课五分钟-0ALinux文件系统及权限-查询命令如何使用 智能大模型个人感觉完全颠覆式改变了学习和教学的模式&#xff0c;知识的重要性荡然无存。 越来越需要重视思路和方法&#xff0c;创新和创意。 090A&#xff1a;接着如下 Linux基础入门的内容包括以…

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

Transformer中位置嵌入的几种形式对比

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

map与set的封装

目录 红黑树的结点 与 红黑树的迭代器 红黑树的实现&#xff1a; 迭代器&#xff1a; ​编辑 红黑树的查找&#xff1a; 红黑树的插入&#xff1a; ​编辑 检查红色结点&#xff1a;​编辑红黑树的左旋 ​编辑红黑树的右旋 ​编辑红黑树的双旋 Map的封装 ​编辑set的…

运行ps显示msvcp140.dll丢失怎么恢复?msvcp140.dll快速解决的4个不同方法

msvcp140.dll无法继续执行代码的主要原因有以下几点 系统缺失&#xff1a;msvcp140.dll是Visual Studio 2015编译的程序默认的库文件&#xff0c;如果系统中没有这个库文件&#xff0c;那么在运行相关程序时就会出现找不到msvcp140.dll的错误提示。 文件损坏&#xff1a;如果…

pythorch的numel()函数计算模型大小与现存占用

本文解释简单给一个模型列子记录如何计算该模型参数量与模型显存占用情况&#xff0c;该文直接调用torchvision库的模型文件构建模型model&#xff0c;在使用parameters()函数遍历&#xff0c;并在遍历情况下使用numel()函数记录模型参数量与显存占用。 代码如下&#xff1a; …

C/C++通过位操作实现2个uint32_t合并为uint64_t

#include <iostream> using namespace std;int main() {uint32_t a 10;uint32_t b 600;//先将uint32_t的a转为uint64_t&#xff0c;此时a前面32位都是0&#xff0c;然后左移32位&#xff0c;此时右32位为0&#xff0c;最后加上uint32_t类型的b&#xff0c;填充右32位的…

【心得】基于flask的SSTI个人笔记

目录 计算PIN码 例题1 SSTI的引用链 例题2 SSTI利用条件&#xff1a; 渲染字符串可控&#xff0c;也就说模板的内容可控 我们通过模板 语法 {{ xxx }}相当于变相的执行了服务器上的python代码 利用render_template_string函数参数可控&#xff0c;或者部分可控 render_…

LDO线性稳压器要不要并联二极管?

昨天介绍过了LDO是什么东西&#xff0c;那么对于它的应用场景是怎么的呢&#xff1f;LDO要不要并联二极管呢&#xff1f; 一般来说&#xff0c;LDO是不需要并联二极管的。 看下图第一个是典型电路&#xff0c;第二个是带可调节电压功能的LDO典型电路&#xff0c;从图里就可以…

【C语言.oj刷题】有序#整型矩阵元素查找##{思路+C源码}

目录 题目信息 题目分析&#xff1a; 法一&#xff1a; 遍历二维数组&#xff08;低效&#xff09; 思路 源码 局限性 法二&#xff1a; 对每一行二分查找&#xff08;有所提效&#xff09; 思路 源码 局限性 法三&#xff1a; 利用一切有利条件使用二分查找 思路 …

基于Vue+SpringBoot的超市账单管理系统 开源项目

项目编号&#xff1a; S 032 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S032&#xff0c;文末获取源码。} 项目编号&#xff1a;S032&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3…

汽车虚拟仿真视频数据理解--CLIP模型原理

CLIP模型原理 CLIP的全称是Contrastive Language-Image Pre-Training&#xff0c;中文是对比语言-图像预训练&#xff0c;是一个预训练模型&#xff0c;简称为CLIP。该模型是 OpenAI 在 2021 年发布的&#xff0c;最初用于匹配图像和文本的预训练神经网络模型&#xff0c;这个任…

腾讯云轻量数据库是什么?性能如何?费用价格说明

腾讯云轻量数据库测评&#xff0c;轻量数据库100%兼容MySQL 5.7和8.0&#xff0c;腾讯云提供1C1G20GB、1C1G40GB、1C2G80GB、2C4G120GB、2C8G240GB五种规格轻量数据库&#xff0c;腾讯云百科txybk.com分享腾讯云轻量数据库测评、轻量数据库详细介绍、特性、配置价格和常见问题解…

大语言模型的三阶段训练

为了训练专有领域模型&#xff0c;选择LLaMA2-7B作为基座模型&#xff0c;由于LLaMA模型中文词表有限&#xff0c;因此首先进行中文词表的扩展&#xff0c;然后进行三阶段训练&#xff08;增量预训练&#xff0c;有监督微调&#xff0c;强化学习&#xff09;。 代码将全部上传…

Transformer中WordPiece/BPE等不同编码方式详解以及优缺点

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…