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

每日一道leetcode(补充版)

1004. 最大连续1的个数 III - 力扣(LeetCode)

题目

给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数 。

示例 1:

输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。

示例 2:

输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。

提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1
  • 0 <= k <= nums.length

思路

  1. 首先定义两个指针,右指针先将可翻转数拉满,找到作为初始的滑动窗口。
  2. 然后没遇到下一个需要翻转的,先统计窗口长度,再将左指针一直后移到窗口内第一个待翻转点后,然后窗口继续后移,直到窗口到达下一个待翻转点或到达数组末尾,最后输出最长窗口长度即可。
  3. 最后补充考虑指针的情况将细节完善即可:
    1. 左右指针在同一个位置;
    2. 右指针在后;
    3. k是否等于0。
    4. 两个指针指向的地方是否都是0.
  4. 将以上几个情况都组合搭配实现窗口移动逻辑。

代码实现

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int left = 0, right = 0, max_length = 0;while(1) {if(right==nums.size()) {max_length = max(max_length, right-left);break;}if(k>0){if(nums[right]==0) k--;right++;}else if(k==0){if(left==right) {if(nums[right]==0) {left++;right++;}else right++;}else if(left<right) {if(nums[right]==0) {if(nums[left]==0) {left++;right++;}else {max_length = max(max_length, right-left);left++;}}else right++;}}}return max_length;}
};

复杂度分析

  • 时间复杂度:双指针移动,右指针遍历一次完整数组,时间复杂度为O(n)。
  • 空间复杂度:O(1)。

官方题解

  • 官方题解还介绍了个二分查找法,感觉不容易想到,而且效率也不如滑动窗口,就不看了。

相关文章:

  • AI提效思考 - 第一期
  • 线程基础题
  • 【Elasticsearch入门到落地】11、RestClient初始化索引库
  • 【最后203篇系列】029 基于Machinations构造回测系统
  • SQL注入 01
  • 机器学习专栏(4):从数据饥荒到模型失控,破解AI训练的七大生死劫
  • 实现对象之间的序列化和反序列化
  • Kubernetes控制平面组件:调度器Scheduler(一)
  • Java 软件测试开发相关资源
  • DSA数据结构与算法 6
  • 快速从S32K358切换到328
  • 在阿里云和树莓派上编写一个守护进程程序
  • NLP 梳理03 — 停用词删除和规范化
  • Python 深度学习实战 第11章 自然语言处理(NLP)实例
  • 嵌入式芯片中的 SRAM 内容细讲
  • 4.20刷题记录(单调栈)
  • 非参数检验题目集
  • 将 JSON 字符串转化为对象的详细笔记 (Java示例)
  • 使用安全继电器的急停电路设计
  • TCP常见知识点整理
  • 海南陵水一酒店保洁员调包住客港币,被判刑一年六个月
  • “仅退款”将成过去时!多个电商平台集体修改售后规则,商家获得更多自主权
  • 全国总工会成立100周年,工运历史和发展成就展将对外展出
  • 隽逸不凡——北京画院藏近代篆刻家金城花鸟画赏析
  • 罗马教皇方济各去世,享年88岁
  • 长三角议事厅·周报|服务业扩大开放:长三角六城联动新探索