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

网站建设与维护工资域名注册查询工具

网站建设与维护工资,域名注册查询工具,网站做app的软件叫什么,做公司网站 烟台文章目录长度最小的子数组习题暴力解法滑动窗口长度最小的子数组 本节对应代码随想录中:代码随想录,讲解视频:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili 习题 题目链接:209. 长度最小的子数…

文章目录

    • 长度最小的子数组
      • 习题
      • 暴力解法
      • 滑动窗口

长度最小的子数组

本节对应代码随想录中:代码随想录,讲解视频:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

习题

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

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

暴力解法

直接能想到的就是用两个 for 循环,第一个循环遍历起始位置,第二个 for 循环向后遍历直到找到满足其和 ≥ target 的位置,我的代码如下(非最优,并且会超时,仅用于个人分析记录):

class Solution {public:int minSubArrayLen(int target, vector<int>& nums) {int res = 999999;for (int i = 0; i < nums.size(); i++) {int sum = 0, count = 999999;for (int j = i; j < nums.size(); j++) {sum += nums[j];if (sum >= target) {count = j - i + 1;break;}}if (count < res) {res = count;}}if(res!=999999){return res;}return 0;}
};

比较代码随想录上的暴力解法,有以下几点可以注意下

  • 初始 res 时本意是想初始一个比较大的值,用 res=INT32_MAX 更好
    • INT_MAX 一般和 INT32_MAX 相同,但如果是16位时, INT_MAX 要更小点,所以用 INT32_MAX 更好
  • 代码中后面两个 if 判断换成三元运算符更好,即 ` ? :

滑动窗口

C++中的滑动窗口是一种常见的数组/字符串问题的解决方案,它可以将一个问题的时间复杂度从 O(n^2)降低到 O(n)或者 O(nlogn),通常涉及到从给定的数据序列中找到需要进行操作的子串或子序列等。

滑动窗口的基本思路是:用两个指针表示现在关注的区间,即左端点(left pointer)和右端点(right pointer),让其构成一个窗口。移动右指针扩大长度,直到包含满足条件的子串(比如大于等于target)。然后,尝试缩小左端点以尽可能的减小满足条件的窗口长度,同时继续移动右指针,查找再次满足条件的子串。重复这个过程直到最右侧,得到最优解。

暴力解法中我们是遍历窗口的初始位置,对于每个初始位置向后遍历剩余元素寻找满足条件的窗口。而滑动窗口是遍历窗口的结束位置,如果当前窗口满足条件,那左边的指针就要向右移动即缩小窗口,其实也算是双指针。

class Solution {public:int minSubArrayLen(int target, vector<int>& nums) {int left = 0, sum = 0,subLength = 0;int ans = INT32_MAX;  // 答案初始化为整数最大值for (int right = 0; right < nums.size(); right++) {sum += nums[right];while (sum >= target) {  // 当sum>=target时,意味着当前窗口的总值大于等于target了subLength = (right - left + 1);  // 取子序列的长度ans = ans < subLength ? ans : subLength;  // 更新anssum -= nums[left]; // 窗口右移那就要减去原来窗口左边的值left++;  // 通过左指针向右移动收缩窗口}}return ans == INT32_MAX ? 0 : ans;  // 如果没找到就返回0}
};

代码中 while (sum >= target) 使用的是 while 而不是 if,因为当缩小窗口的时候是一个循环的过程。

如1 1 1 4中 target=4,那找到满足条件的窗口=4的时候,左指针应该是从初始的1不断向右移动直到新的窗口不大于等于 target 时停止

http://www.dt0577.cn/news/43025.html

相关文章:

  • 做外单要上什么网站全网热搜榜第一名
  • 网站制作二级网页怎么做杭州百度
  • 那个网站做旅游规划好惠州seo优化
  • wordpress用什么url最好seo 360
  • 深圳网站建设推广论坛seo人工智能
  • 网站运营需要++做哪些工作厦门网站制作
  • 创建公司网站免费网络市场调研
  • iis默认网站启动不了厦门百度关键词优化
  • 用vs做购物网站下载西昌seo快速排名
  • 花卉市场网站建设基本步骤百度搜索引擎入口登录
  • 用dw做网站毕业设计中国互联网公司排名
  • 浅析php网站建设的八大优势青岛网站seo诊断
  • 开发网站用什么工具做设计自媒体人专用网站
  • 宁波网站建设方案报价最近几天的新闻大事
  • 温州多语言网站建设关键词推广是什么
  • 厦门做网站的人力资源培训与开发
  • 制作企业网站的步骤网络推广方案范例
  • 广州网站建设案例重庆森林经典台词 凤梨罐头
  • 南宁有多少家网站建设推广的公司seo外链软件
  • 指定网站长期建设 运营计划官网seo优化
  • 广州网站建设讯度企业如何网络推广
  • 网站建设合作哈尔滨seo优化
  • 网站做适配手机要多久武汉关键词包年推广
  • 做基础销量的网站电商培训机构需要什么资质
  • 互动科技网站建设网站链接交易
  • python 如何做网站艾滋病多长时间能查出来
  • 展示型网站包含哪些模块最近时事新闻热点事件
  • 企业网站建设费用大约多少钱如何制定会员营销方案
  • 一个网站怎么上线app推广代理平台
  • 什么网站有加工外发做的2023年8月新冠又来了