算法之路(二)

🖊作者 : 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;
    }

✔总结:

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

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux线程编程

Linux线程编程初步 一些历史背景 Linux间接起源于Unix&#xff0c;而Linux诞生时并不存在 "线程"的概念。在20世纪90年代线程才流行起来&#xff0c;POSIX Thread标准于 1995年确立。Unix中引入 Thread 之后&#xff0c;大量函数被重写&#xff0c;信号机制也变得复…

AI实践与学习1_Milvus向量数据库实践与原理分析

前言 随着NLP预训练模型&#xff08;大模型&#xff09;以及多模态研究领域的发展&#xff0c;向量数据库被使用的越来越多。 在XOP亿级题库业务背景下&#xff0c;对于试题召回搜索单单靠着ES集群已经出现性能瓶颈&#xff0c;因此需要预研其他技术方案提高试题搜索召回率。…

AVL树和红黑树

AVL树和红黑树 一、AVL树1. 概念2. 原理AVL树节点的定义插入不违反AVL树性质违反AVL树性质左单旋右单旋左右双旋右左双旋总结 删除 3. 验证代码4. AVL树完整实现代码 二、红黑树1. 概念2. 性质3. 原理红黑树节点的定义默认约定插入情况一 &#xff08;u存在且为红&#xff09;情…

MySQL InnoDB 引擎底层解析(一)

6. InnoDB 引擎底层解析 MySQL 对于我们来说还是一个黑盒&#xff0c;我们只负责使用客户端发送请求并等待服务器返回结果&#xff0c;表中的数据到底存到了哪里&#xff1f;以什么格式存放的&#xff1f;MySQL 是以什么方式来访问的这些数据&#xff1f;这些问题我们统统不知…

创新案例|云服务平台HashiCorp是如何构建开源社区实现B2B增长飞轮

社区文化是HashiCorp企业文化的重要组成部分。虽然众多公司声称自己是社区驱动&#xff0c;但实际付诸行动的很少。与众不同的是&#xff0c;HashiCorp从一开始就将社区视为战略方针的核心&#xff0c;这也影响和塑造了公司今天的发展方向。社区不仅是执行策略之一&#xff0c;…

约数个数定理

首先在讲这个定理前&#xff0c;首先科普一下前置知识 约数&#xff1a; 何为约数&#xff0c;只要能整除n的整数就是n的约数&#xff0c;举个例子&#xff0c;3的约束是1和3因为1和3能整除3 质数&#xff1a; 除了这个数字本身和1以外没有其他因子的数字就叫质数&#xff…

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

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

日志维护库:loguru

在复杂的项目中&#xff0c;了解程序的运行状态变得至关重要。在这个过程中&#xff0c;日志记录&#xff08;logging&#xff09;成为我们追踪、调试和了解代码执行的不可或缺的工具。在python语言中常用logging日志库&#xff0c;但是logging日志库使用相对繁琐&#xff0c;在…

Linux远程工具专家推荐(二)

8. Apache Guacamole Apache Guacamole 是一款免费开源的无客户端远程桌面网关&#xff0c;支持 VNC、RDP 和 SSH 等标准协议。无需插件或客户端软件&#xff1b;只需使用 HTML5 Web 应用程序&#xff08;例如 Web 浏览器&#xff09;即可。 这意味着您的计算机的使用不受任何一…

ElasticSearch学习篇6_ES实践与Lucene对比及原理分析技术分享小记

前言 QBM、MFS的试题检索、试题查重、公式转换映射等业务场景以及XOP题库广泛使用搜索中间件&#xff0c;业务场景有着数据量大、对内容搜索性能要求高等特点&#xff0c;其中XOP题库数据量更是接近1亿&#xff0c;对检索性能以及召回率要求高。目前QBM、MFS使用的搜索中间件是…

LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄

接着前两节的Langchain&#xff0c;继续实现Langchain中的Agent LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字 代码实现 # 从langchain库中导入模块 from langchain.llms import OpenAI # 从langchain.l…

软件测试: 测试用例

一. 软件测试四要素 测试环境,操作步骤,测试数据,预期结果 二. 基于需求进行测试用例的设计 基于需求设计测试用例是测试设计和开发测试用例的基础,第一步就要分析测试需求,验证需求是否正确,完整,无二义性,并且逻辑自洽.在需求正确的基础上细化测试需求,从测试需求提炼出一…

最全的接口自动化测试思路和实战:【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具&#xff0c;并可以用来“驱动&#xff02;待测应用程序和数据的测试脚本代码&#xff0c;关键字驱动测试看上去与手工测…

三天吃透Redis面试八股文

目录&#xff1a; Redis是什么&#xff1f;Redis优缺点&#xff1f;Redis为什么这么快&#xff1f;讲讲Redis的线程模型&#xff1f;Redis应用场景有哪些&#xff1f;Memcached和Redis的区别&#xff1f;为什么要用 Redis 而不用 map/guava 做缓存?Redis 数据类型有哪些&…

DrugMAP: molecular atlas and pharma-information of all drugs学习

DrugMAP&#xff1a;所有药物的分子图谱和制药信息 - PMC (nih.gov) DrugMAP: the molecular atlas and pharma-information of drugs (idrblab.net) 构建了一个描述药物分子图谱和药物信息的新数据库&#xff08;DrugMAP&#xff09;。它提供了>30 000种药物/候选药物的相…

前端调取摄像头并实现拍照功能

前言 最近接到的一个需求十分有意思&#xff0c;设计整体实现了前端仿 微信扫一扫 的功能。整理了一下思路&#xff0c;做一个分享。 tips: 如果想要实现完整扫一扫的功能&#xff0c;你需要掌握一些前置知识&#xff0c;这次我们先讲如何实现拍照并且保存的功能。 一. wind…

Mybatis-Plus《学习笔记 22版尚硅谷 》——感谢【尚硅谷】官方文档

Mybatis-Plus《学习笔记 22版尚硅谷 》 一、MyBatis-Plus1.简介2.特性3.支持数据库4.框架结构5.官方地址 二、入门案例1.开发环境2.建库建表3.创建工程4.配置编码5.测试查询 三、增删改查1.BaseMapper<T>2.调用Mapper层实现CRUD2.1 插入2.2 删除a、根据ID删除数据b、根据…

深入理解栈与队列:从基本概念到高级实现

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

【Dubbo】Dubbo负载均衡实现解析

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

如何在本地搭建Oracle数据库实现公网环境下通过PLSQL工具进行远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…