当前位置: 首页 > news >正文

大厂县住房和城乡建设局网站168推广网

大厂县住房和城乡建设局网站,168推广网,java做的网站 jsp,国际新闻最新报道目录 解法⼀(暴力求解)(不会超时,可以通过):一.长度最小的子数组(medium) 题目链接209. 长度最小的子数组 - 力扣(LeetCode) 解法: 代码&#…

目录

解法⼀(暴力求解)(不会超时,可以通过):一.长度最小的子数组(medium)

题目链接·209. 长度最小的子数组 - 力扣(LeetCode)

解法:

代码:

二:无重复字符的最长⼦串(medium)

题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode)

解法:

代码:

三:最大连续 1 的个数 III(medium)

题目链接:1004. 最大连续1的个数 III - 力扣(LeetCode)

解法:

代码:

四:将 x 减到 0 的最⼩操作数 (medium)

题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

解法:

代码:


解法⼀(暴力求解)(不会超时,可以通过):一.长度最小的子数组(medium)

题目链接·209. 长度最小的子数组 - 力扣(LeetCode)

解法:

解法⼀(暴力 求解)(会超时):
「从前往后」枚举数组中的任意⼀个元素,把它当成起始位置。然后从这个「起始位置」开始,然后寻找⼀段最短的区间,使得这段区间的和「⼤于等于」目标值。将所有元素作为起始位置所得的结果中,找到「最小值」即可。
在这里我们发现由于数组是一个正整数数组,也就是说这个区间选择的数越多那么数的总和就越大。
如上图所示,当我们选择 2 3 1 2 的区间时候 sum=8 就已经满足题意,此时长度为4,若我们继续向后扩大区间那么长度会一直增大,因此当 right=4 的时候我们其实就可以不继续扩大区间了。
那么此时我们保持 right 不动移动 left ,因为我们知道上一个区间的值 sum=8 当我们移动 left 后只需要减去移出区间的值2我们就可以知道新区间的值
解法二(滑动窗口 ):
那么这里其实我们就可以使用上述 思想来实现 利用单调性,使用“同向双指针”来进行优化。
怎么使用呢?看下面的流程就明白了。

代码:

C++:
java:

二:无重复字符的最长⼦串(medium)

题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode)

解法:

解法⼀(暴力求解)(不会超时,可以通过):
枚举「从每⼀个位置」开始往后,⽆重复字符的子串可以到达什么位置。找出其中长度最⼤的即可。
在往后寻找⽆重复⼦串能到达的位置时,可以利用「哈希表」统计出字符出现的频次,来判断什么时候⼦串出现了重复元素
当出现哈希冲突时right前面的子串就是一个 ⽆重复字符的子串。
此时我们让 left 向后移动一位如果我们再让 right 重新走那么它又会走到第二个 a 的位置
因为重复的a还在区间内,因此left取前面的字母所出现的⽆重复字符的子串都不会比取 d 时更长
所以我们的正确做法是让left直接跳到冲突的字母之后,保持 right 不变。
这就是滑动窗口的思想。
解法二(滑动窗口):
研究的对象依旧是⼀段连续的区间,因此继续使⽤「滑动窗⼝」思想来优化。
让滑动窗⼝满⾜:窗⼝内所有元素都是不重复的。
做法:
  • 右端元素 ch 进⼊窗⼝的时候,哈希表统计这个字符的频次:
  • 如果这个字符出现的频次超过 1 ,说明窗⼝内有重复元素,那么就从左侧开始划出窗口, 直到 ch 这个元素的频次变为 1 ,然后再更新结果。
如果没有超过 1 ,说明当前窗⼝没有重复元素,可以直接更新结果

代码:

C++:
java:

三:最大连续 1 的个数 III(medium)

题目链接:1004. 最大连续1的个数 III - 力扣(LeetCode)

解法:

不要去想怎么翻转,不要把问题想的很复杂,这道题的结果⽆非就是⼀段连续的 1 中间塞了 k 个 0 。 因此,我们可以把问题转化成:求数组中⼀段最长的连续区间,要求这段区间内 0 的个数不超过 k 个。

解法⼀(暴力求解):

暴力枚举+0计数器

这里就不讲暴力了。。。

解法二(滑动窗口):

在暴力求解地思路中,到这种情况时我们应该让 left++ 让 right 重新在left位置开始遍历。

但是如果这样的话我们会发现,right还是会停在之前那个位置,这是因为出窗口的数字为1并不是0,而那k个0都还在窗口里。

因此我们滑动窗口的思路就是 left 和 right 都向后走,left 走的时候要让窗口合法(也就是窗口里的0< k)时left 才停下来。

流程:

  • 初始化⼀些变量 left = 0 , right = 0 , ret = 0
  • right ⼩于数组⼤⼩的时候,⼀直下列循环:
  1. 让当前元素进⼊窗⼝,顺便统计到哈希表中;
  2. 检查 0 的个数是否超标: 
  • 如果超标,依次让左侧元素滑出窗⼝,顺便更新哈希表的值,直到 0 的个数恢复正常;
  1.    程序到这⾥,说明窗口内元素是符合要求的,更新结果; 
  2. right++ ,处理下⼀个元素; 
  • 循环结束后, ret 存的就是最终结果。

代码:

C++:
java:
 

四:将 x 减到 0 的最⼩操作数 (medium)

题目链接:1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

  

解法:

题目要求的是数组「左端+右端」两段连续的、和为 x 的最短数组,信息量稍微多⼀些,不易理清思路;我们可以转化成求数组内⼀段连续的、和为 sum(nums) - x 的最长数组。此时,就是熟悉的「滑动窗口」问题了。
  •  转化问题:求 target = sum(nums) - x 。如果 target < 0 ,问题⽆解;
  • 初始化左右指针 l = 0 , r = 0 (滑动窗⼝区间表⽰为 [l, r) ,左右区间是否开闭很重要,必须设定与代码⼀致),记录当前滑动窗⼝内数组和的变量 sum = 0 ,记录当前满足条件数组的最⼤区间⻓度 maxLen = -1
  • r 小于等于数组⻓度时,⼀直循环:
  1. 如果 sum < target ,右移右指针,直⾄变量和⼤于等于 target ,或右指针已经移到头;
  2. 如果 sum > target ,右移左指针,直⾄变量和⼩于等于 target ,或左指针已经移到 头;
  3. 如果经过前两步的左右移动使得 sum == target ,维护满⾜条件数组的最大长度,并让下个元素进入窗口
  • 循环结束后,如果 maxLen 的值有意义,则计算结果返回;否则,返回 -1  

 ==================== ==================== 

正难则反

当我们找到最合适的位置时(也就是区级和sum>=目标):

此时我们移动left,但是由于我们right前面的区间<目标值,如果right回去重新走那么依旧会白走前面的区间。。因此right没有必要再回到前面去

流程:

代码:

C++:

java:

http://www.cadmedia.cn/news/6426.html

相关文章:

  • wordpress建站网企业门户网站模板
  • 开源代码seo算法培训
  • 智慧团建学生登录入口手机版怎么做好seo内容优化
  • 网页服务器一年多少钱廊坊seo快速排名
  • 义乌门户网站建设痘痘如何去除效果好
  • shopncwindows优化大师好不好
  • 电子科技技术支持东莞网站建设好网站制作公司
  • 山西专业网站建设价目手机百度下载免费
  • 商城网站建设哪家便宜无人区在线观看高清1080
  • 哪里有服务好的网站建设360广告推广平台
  • 重庆网站建设公司有哪些什么时候友情链接
  • 网站icp备案流程站内优化怎么做
  • 南京江宁区住房建设局网站百度的代理商有哪些
  • 免费网站建站一级大陆平台seo什么意思
  • 智联招聘网最新招聘2022seo站内优化最主要的是什么
  • 网站建设过程郑州seo网络推广
  • 班徽logo设计图片武汉seo全网营销
  • 网站建设数据中心如何联系百度人工客服
  • 用手机搭建自己的网站网络营销怎么做?
  • 织梦新闻门户网站模板橘子seo查询
  • 市政府网站建设建议软文范例大全1000字
  • 建设银行个人网上银行网站加载发软文是什么意思
  • 做微信网站公司哪家好网站seo技术
  • 银川市住房城乡建设局网站北京网聘咨询有限公司
  • 网站建设项目说明书广州最新消息
  • 家政公司网站建设6个好用的bt种子搜索引擎
  • 湖南营销型网站建设 j磐石网络短视频运营公司
  • 电脑版 做网站尺寸培训心得体会2000字
  • 宜城市城乡建设局网站百度的网站
  • 长春网页建站模板疫情最新政策最新消息