算法之路(二)

🖊作者 : 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),则直接返回-1if(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.mzph.cn/news/150141.shtml

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

相关文章

力扣:172. 阶乘后的零(Python3)

题目&#xff1a; 给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长…

单链表相关面试题--3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

/* 解题思路&#xff1a; 通过快慢指针找到中间节点&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff0c;当快指针走到结尾的时候&#xff0c;慢指针正好走到中间位置 */ typedef struct ListNode Node; struct ListNode* middleNode(struct ListNode* head)…

后端接口测试,令牌校验住,获取tocken 接口的方式

post : http://127.0.0.1:端口号/login { "username":"admin", "password":"admin123", "code":"3", "uuid":"966c34e409434f15942ec29a284da0a6" } headers tocken false

Vue3-provide 和 inject 跨组件传递数据

Vue3-provide 和 inject 跨组件传递数据 功能&#xff1a;将数据从App组件跨过一个组件传递到B组件中provide&#xff1a;提供数据inject&#xff1a;接收数据 // App.vue <template><h2>我是App组件&#xff08;{{num}}&#xff09;</h2><A></A&g…

软件测试/测试开发/人工智能丨视觉与图像识别自动化测试

视觉与图像识别在软件自动化测试领域中的应用是越来越重要的一项技术&#xff0c;它使得测试可以更全面、准确地模拟用户对图形用户界面&#xff08;GUI&#xff09;的交互。以下是视觉与图像识别在软件自动化测试中的主要应用&#xff1a; 1. 自动化 GUI 测试 视觉与图像识别…

服务器IPMI管理操作

简介&#xff1a;智能平台管理界面&#xff08;IPMI&#xff0c;Intelligent Platform Management Interface)是管理基于 Intel 结构的企业系统中所使用的外围设备采用的一种工业标准&#xff0c;用户可以利用IPMI监视服务器的物理健康特征&#xff0c;如温度、电压、风扇工作状…

使用Spark SQL读取阿里云OSS的数据

读OSS数据 创建一个table&#xff0c;并关联OSS目录路径 CREATE TABLE my_table USING parquet OPTIONS (path oss://my_bucket/my_data_dir/dt20230904, -- 关联OSS路径header true, -- 如果Parquet文件包含列名的头部信息&#xff0c;则设置为true&#xff0c;否则设置为f…

马斯克回应OpenAI混乱:如果这关乎AI安全,那将影响整个地球

马斯克回应OpenAI混乱&#xff1a;如果这关乎AI安全&#xff0c;那将影响整个地球 2023-11-20 16:14秦丝进销存 近日&#xff0c;“马斯克回应ChatGPT之父被开除”登上热搜&#xff0c;特斯拉首席执行官马斯克曾与ChatGPT之父奥特曼一起创建OpenAI&#xff1b; 他在一篇”网友…

js中什么看做false

js中什么看做false 在javascript中&#xff0c;有一些值会被视为false&#xff0c;这些值通常被称为“假值(falsy values)”。虽然它们不是布尔值真正意义上的false&#xff0c;但它们在条件语句判断中会被视为假false&#xff0c;因此了解这些假值非常重要。 下面是javascri…

以八电极模块做一个脂肪秤方案设计

脂肪遍布我们全身&#xff0c;除了基础脂肪&#xff0c;在骨头、神经等组织都有它的存在&#xff0c;起到一种隔热、保温和缓冲的作用。脂肪在人体重量的占比(体脂率)是检测肥胖最佳的方法。 所以近几年开始流行起脂肪秤这类型的电子秤&#xff0c;只要站上去就能轻松知道自己…

海康威视综合安防管理平台任意文件上传

系统介绍 HIKVISION iSecure Center综合安防管理平台是一套“集成化”、“智能化”的平台&#xff0c;通过接入视频监控、一卡通、停车场、报警检测等系统的设备&#xff0c;获取边缘节点数据&#xff0c;实现安防信息化集成与联动&#xff0c;公众号&#xff1a;web安全工具库…

《QT从基础到进阶·三十》QVariant的基础用法

很多时候&#xff0c;需要几种不同的数据类型需要传递&#xff0c;如果用结构体&#xff0c;又不大方便&#xff0c;容器保存的也只是一种数据类型&#xff0c;而QVariant则可以统统搞定。 QVariant可以保存QT和C常用类型&#xff0c;如果是自定义类型&#xff0c;比如struct,c…

DC综合基本概念:set_compile_directives

控制high-level 优化操作在cells&#xff0c;hierarchical pins&#xff0c;references&#xff0c;designs&#xff0c;library cells。 set_compile_directives object_list [-delete_unloaded_gate true | false]删除unloaded gates [-constant_propagation true | fal…

【Django使用】django经验md文档10大模块。第4期:Django数据库增删改查

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能强大的第三方插件&#xff0c;你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展…

理解复制构造和赋值操作符之间的区别

类能报告对象的创建、销毁、赋值以及每个对象一个识别号&#xff08;代码来源于C沉思录&#xff09; #include <iostream>class Test{ public:Test();Test(const Test&);Test& operator(const Test&);~Test(); private:static int count;int id; };int Test…

【计算机网络笔记】网络地址转换(NAT)

系列文章目录 系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08…

mongodb——概念介绍(文档,集合,固定集合,元数据,常用数据类型)

mongodb 层级结构 实例&#xff1a;系统上运行的进程及节点集&#xff0c;一个实例可以有多个库&#xff0c;默认端口 27017。 库&#xff1a;多个集合组成数据库&#xff0c;每个数据库都是独立的&#xff0c;有自己的用户、权限信息&#xff0c;独立的存储文件集 合。 集合&…

第十七篇-Awesome ChatGPT Prompts-备份-百度翻译

Awesome ChatGPT Prompts——一个致力于提供挖掘ChatGPT能力的Prompt收集网站 https://prompts.chat/ 第十六篇-Awesome ChatGPT Prompts-备份【英文】 第十七篇-Awesome ChatGPT Prompts-备份-百度翻译 【中文】 高效提示词请参考,各种场景&#xff0c;2023-11-16内容如下(百…

C++部分知识点对应汇编代码

1.类初始化 通过类对象调用函数时&#xff0c;this指针会作为第一个参数 class MySharePtr {public:MySharePtr(int val) : a(val) {// a val; // 不使用初始化列表的方式}int a 10; };// 使用初始化列表的方式&#xff0c; 直接使用传入的参数进行构造 MySharePtr::MyS…

QT 使用mysql

版本&#xff1a;ubuntu&#xff1a;20.04.1 mysql&#xff1a; 8.0.35 QT &#xff1a;5.12.8 1.安装mysql sudo apt install mysql-server 下载完后查看mysql状态 sudo service mysql status 如下图active&#xff08;running&#xff09;则下载成功&#xff0c;运行中…