5 九阳神功第三式 :滑动窗口
5.1 滑动窗口介绍
出处:(https://zhuanlan.zhihu.com/p/61564531)
滑动窗口法,也叫尺取法(可能也不一定相等,大概就是这样),可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续,因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。往往类似于“请找到满足xx的最x的区间(子串、子数组)的xx”这类问题都可以使用该方法进行解决。
5.1.1 长度最小的子数组(#209)
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。示例:
输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

一旦知道这个位置开始的子数组不会是最优答案了,我们就可以移动左端点。我们用 2 个指针,一个指向数组开始的位置,一个指向数组最后的位置,并维护区间内的和 sum 大于等于 ss 同时数组长度最小。

5.1.2 无重复字符的最长子串(#3)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

5.1.3 最大连续1的个数 III(#1004)
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
示例 1:
输入:A = [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:
输入:A = [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。
5.2 代表题目:尽可能使字符串相等(#1208)

5.3 触类旁通
5.3.1 至多包含 K 个不同字符的最长子串(#340会员_困难)

/*

  • Copyright © Huawei Technologies Co., Ltd. 2012-2018. All rights reserved.

  • Description: 项目 LEET_340_LongestSubstringforKDiffChar 的源文件

  • Author: f00485759

  • Create: 2019-12-16
    */
    #include <stdio.h>
    #include <stdbool.h>
    #include “securec.h”
    #define MAX_HASH_NUM 256
    #define MAX(a, b) ((a) > (b) ? (a) : (b))
    int g_hash[MAX_HASH_NUM];
    void Init(void)
    {
    (void)memset(g_hash, 0, sizeof(g_hash));
    }
    void HashChar(char c)
    {
    g_hash[c]++;
    }
    void DeHashChar(char c)
    {
    if (g_hash[c] > 0) {
    g_hash[c]–;
    }
    }
    bool IsExtendKChar(int k)
    {
    int count = 0;
    for (int i = 0; i < MAX_HASH_NUM; i++) {
    if (g_hash[i] != 0) {
    count++; // 可以通过变量来记忆,减少计算量
    }
    if (count >= k) {
    return true;
    }
    }

    return false;
    }

bool IsRepeat(char c)
{
if (g_hash[c] != 0) {
return true;
}

return false;

}
int lengthOfLongestSubstringKDistinct(const char *s, int k)
{
int start, end, maxlen;
int slen = (int)strlen(s);
Init();
start = 0;
maxlen = 0;
for (end = 0; end < slen; end++) {
if (!IsExtendKChar(k) || IsRepeat(s[end])) {
HashChar(s[end]);
continue;
}

    if (start == end) {break;}maxlen = MAX(maxlen, end - start);DeHashChar(s[start]);start++;while (IsExtendKChar(k)) {DeHashChar(s[start]);start++;}HashChar(s[end]);
}
maxlen = MAX(maxlen, end - start);
return maxlen;

}
int main()
{
const char *s = “a”;
int k = 0;

int maxlen = lengthOfLongestSubstringKDistinct(s, k);printf("%d\n", maxlen);return 0;

}
5.3.2 最少交换次数来组合所有的 1(#1151会员)

5.3.3 至多包含两个不同字符的最长子串(#159会员)

5.3.4 长度为 K 的无重复字符子串(#1100会员)

#define MAX_LEN 512
int g_array[MAX_LEN];

int numKLenSubstrNoRepeats(char * s, int k){
int right = 0;
int left = 0;
int result = 0;
int count = 0;
int len;

len = strlen(s);
memset(g_array, 0, sizeof(g_array));while (right < len) {if (g_array[s[right]] == 0) {count++;    }g_array[s[right]]++;while (right - left + 1 > k) {g_array[s[left]]--;if (g_array[s[left]] == 0) {count--;}left++;}printf("%d, %d, %d\n", right, left, count);if ((right - left + 1 == k) && (count == k)) {result++;}right++;
}return result;

}

java算法合集-九阳神功第三式滑动窗口相关推荐

  1. php 3 3公派算法代码,PHP常见算法合集代码实例

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣,下面是一些常用的算法和实例,大家可以好好学习下 一.文件夹遍历 function allFile($path = __DIR_ ...

  2. php最常见代码,PHP常见算法合集代码实例

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣,下面是一些常用的算法和实例,大家可以好好学习下 一.文件夹遍历<?php function allFile($path ...

  3. 【Java 面试合集】接口以及抽象类

    接口以及抽象类 1. 概述 嗨,[Java 面试合集]又来了,今天给大家分享的内容是接口以及抽象类. 一看这个概念很多人都知道,但是方方面面的细节不一定知道哦,今天我们就从方方面面的细节来讲讲 2. ...

  4. 算法合集之《信息学中守恒法的应用》(不错的文章保存一下)

    算法合集之<信息学中守恒法的应用>(不错的文章保存一下) by 三江小渡 [摘要]本文提出和总结了"守恒法",以及它在信 息学竞赛中的一些应用.守恒的本质是寻找变化中的 ...

  5. 《安富莱嵌入式周报》第297期:开源生物医学成像系统,可肺部成像,C算法合集500例,突出极致运算速度,数值方法书籍,芯片级激光隔离,3D打印机固件Marlin

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  6. JAVA毕设合集【20套系统项目】

    对于即将毕业的大学生来说,完成毕业设计是最后一关,该如何完成呢? 今天呢,给大家分享一个毕设系统项目合集 共有20套 简介目录: 1.新冠疫情统计系统 2.进销存管理系统 3.家教系统 4.饮食分享平 ...

  7. 只会温水煮青蛙,工作都找不到还不好好学这份16W字Java面试合集

    蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力.培训.出国.大公司的经历,还有很多很好的朋友.但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜 ...

  8. 别再找借口了!找不到工作还不好好学一下这份16W字Java面试合集

    背景 前两天在朋友圈发了一条招人的感慨,关于大厂招人和小公司招人的区别. 大厂:有影响力,有钱,能够吸引了大量的应聘者.因此,也就有了筛选的资格,比如必须985名校毕业,必须35岁以下,不能5年3跳, ...

  9. Java算法:LeetCode算法Java版合集513-1110题

    513. 找树左下角的值 题目描述 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入:2/ \1 3 输出: 1 示例 2: 输入:1/ \2 3/ / \4 5 6/7 输出: 7 ...

  10. 最全Java项目合集(附源码课件),可完美运行

    当今时代是飞速发展的信息时代.在各行各业中离不开信息处理,而有信息处理就离不开信息管理系统,这使得信息管理系统被广泛应用于各领域 其中系统设计是一个把软件需求转换成用软件系统表示的过程.通过对目标系统 ...

最新文章

  1. R单变量可视化(Histograms、 Index Plots、Time-Series Plots、Pie Charts)
  2. Spring Cloud和Dubbo的区别
  3. js中对象的私有属性和公有属性
  4. 网站SEO优化该如何选择适合的关键词优化?
  5. [zz] 几种类间关系:继承、实现、依赖、关联、聚合、组合及UML实现图
  6. c语言函数调用参数太少,调用input_message的参数太少在主函数中 是神马意思 大神们帮帮我...
  7. 用《叩响C#之门》复习C#基础知识 第五章 枚举、结构体和数组
  8. 数据装载 计算执行脚本总耗时_shell源码_01
  9. MobileNet V3简单总结
  10. sql2018 ssas_如何使用SQL Server Analysis Services(SSAS)从头开始构建多维数据集
  11. css中调整高度充满_css - DIV高度怎样充满容器?
  12. sklearn 文本处理
  13. Red Hat Enterprise Linux的一些简单操作(备忘录)
  14. kibana从入门到精通-Kibana配置详解
  15. 推荐个国产框架,从此轻松开发 小程序/App/h5
  16. 基于SSM的毕业论文管理系统
  17. Windows XP Nlite 2007珍藏版 BY 丘比特
  18. api 与 implement 的区别
  19. Android 时间API
  20. RocketMQ 优雅停机技巧

热门文章

  1. PyMol2.5的基础使用
  2. 【Node.js 微信公众号实战】4.Node.js 微信消息管理
  3. 12.28 笔记 (集合) --- 耐得住寂寞
  4. 多项式计算的Horner 方法
  5. 存储卡被格式化了咋恢复文件?
  6. 打印机驱动如何连接计算机,打印机与电脑第一次连接驱动怎么操作
  7. 2020考研计算机(408)考试大纲
  8. 黑群晖frp内网穿透配置
  9. python模拟抛硬币_1-简单的Python程序-模拟抛硬币
  10. JSP文件的打开方式