java算法合集-九阳神功第三式滑动窗口
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算法合集-九阳神功第三式滑动窗口相关推荐
- php 3 3公派算法代码,PHP常见算法合集代码实例
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣,下面是一些常用的算法和实例,大家可以好好学习下 一.文件夹遍历 function allFile($path = __DIR_ ...
- php最常见代码,PHP常见算法合集代码实例
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣,下面是一些常用的算法和实例,大家可以好好学习下 一.文件夹遍历<?php function allFile($path ...
- 【Java 面试合集】接口以及抽象类
接口以及抽象类 1. 概述 嗨,[Java 面试合集]又来了,今天给大家分享的内容是接口以及抽象类. 一看这个概念很多人都知道,但是方方面面的细节不一定知道哦,今天我们就从方方面面的细节来讲讲 2. ...
- 算法合集之《信息学中守恒法的应用》(不错的文章保存一下)
算法合集之<信息学中守恒法的应用>(不错的文章保存一下) by 三江小渡 [摘要]本文提出和总结了"守恒法",以及它在信 息学竞赛中的一些应用.守恒的本质是寻找变化中的 ...
- 《安富莱嵌入式周报》第297期:开源生物医学成像系统,可肺部成像,C算法合集500例,突出极致运算速度,数值方法书籍,芯片级激光隔离,3D打印机固件Marlin
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- JAVA毕设合集【20套系统项目】
对于即将毕业的大学生来说,完成毕业设计是最后一关,该如何完成呢? 今天呢,给大家分享一个毕设系统项目合集 共有20套 简介目录: 1.新冠疫情统计系统 2.进销存管理系统 3.家教系统 4.饮食分享平 ...
- 只会温水煮青蛙,工作都找不到还不好好学这份16W字Java面试合集
蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力.培训.出国.大公司的经历,还有很多很好的朋友.但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜 ...
- 别再找借口了!找不到工作还不好好学一下这份16W字Java面试合集
背景 前两天在朋友圈发了一条招人的感慨,关于大厂招人和小公司招人的区别. 大厂:有影响力,有钱,能够吸引了大量的应聘者.因此,也就有了筛选的资格,比如必须985名校毕业,必须35岁以下,不能5年3跳, ...
- Java算法:LeetCode算法Java版合集513-1110题
513. 找树左下角的值 题目描述 给定一个二叉树,在树的最后一行找到最左边的值. 示例 1: 输入:2/ \1 3 输出: 1 示例 2: 输入:1/ \2 3/ / \4 5 6/7 输出: 7 ...
- 最全Java项目合集(附源码课件),可完美运行
当今时代是飞速发展的信息时代.在各行各业中离不开信息处理,而有信息处理就离不开信息管理系统,这使得信息管理系统被广泛应用于各领域 其中系统设计是一个把软件需求转换成用软件系统表示的过程.通过对目标系统 ...
最新文章
- R单变量可视化(Histograms、 Index Plots、Time-Series Plots、Pie Charts)
- Spring Cloud和Dubbo的区别
- js中对象的私有属性和公有属性
- 网站SEO优化该如何选择适合的关键词优化?
- [zz] 几种类间关系:继承、实现、依赖、关联、聚合、组合及UML实现图
- c语言函数调用参数太少,调用input_message的参数太少在主函数中 是神马意思 大神们帮帮我...
- 用《叩响C#之门》复习C#基础知识 第五章 枚举、结构体和数组
- 数据装载 计算执行脚本总耗时_shell源码_01
- MobileNet V3简单总结
- sql2018 ssas_如何使用SQL Server Analysis Services(SSAS)从头开始构建多维数据集
- css中调整高度充满_css - DIV高度怎样充满容器?
- sklearn 文本处理
- Red Hat Enterprise Linux的一些简单操作(备忘录)
- kibana从入门到精通-Kibana配置详解
- 推荐个国产框架,从此轻松开发 小程序/App/h5
- 基于SSM的毕业论文管理系统
- Windows XP Nlite 2007珍藏版 BY 丘比特
- api 与 implement 的区别
- Android 时间API
- RocketMQ 优雅停机技巧