Java算法-滑动窗口算法(Sliding Window)(十)

本文介绍了五个Java编程问题,涉及滑动窗口技术在查找最长无重复字符子串、字符串长度计算、数组中相等元素的最大距离、满足和条件的连续子数组长度以及仅含1的最长子数组长度等场景的应用。
摘要由CSDN通过智能技术生成

解题思路

代码实现

public static int [] maxSlidingWindow(int [] nums,int k) {

int[] res = new int[nums.length - k + 1];

LinkedList l = new LinkedList<>();

for (int i = 0; i < nums.length; i++) {

l.add(nums[i]);

// 循环当 集合长度等于 k 吧0 位置数据 添加至res

if (l.size() == k) {

res[i - k+1] = Collections.max(l);

l.removeFirst();

}

}

return res;

}

2. 题目描述

给定一个字符串如:“accekcbbt”,请你找出其中不含有重复字符的 最长子串 的长度。

建立一个集合存放 每个字符;

a

a c 找到集合长度为2的连续不同数据,寻找以3为窗口是否存在连续不同数据,

a c c 3为窗口,添加新数据,存在重复删除 0位置数据

c c e 3为窗口,添加新数据,存在重复删除 0位置数据

c e k 找到集合长度为3的连续不同数据, 寻找以4为窗口是否存在连续不同数据

c e k c 4为窗口,添加新数据,存在重复删除 0位置数据

e k c b 找到集合长度为3的连续不同数据, 寻找以4为窗口是否存在连续不同数据

e k c b b 5为窗口,添加新数据,存在重复删除 0位置数据

k c b b t 5为窗口,添加新数据,存在重复删除 0位置数据

结果 5为窗口的连续不同数据 没有找到,现在数组中存放的数据长度为最大移动窗口

代码实现

public static int maxStrSlidingWindow(String str){

LinkedList l = new LinkedList<

滑动窗口算法Sliding Window Algorithm)是一种常用的算法技巧,用于解决一些数组或字符串相关的问题。它通过维护一个固定大小的窗口,并在窗口滑动的过程中对窗口中的元素进行处理,从而得到问题的解。 下面是一个使用滑动窗口算法解决问题的示例,使用Java语言实现: ```java public class SlidingWindowAlgorithm { public static void main(String[] args) { int[] nums = {2, 4, 1, 5, 3, 2, 7, 1}; int targetSum = 8; int result = findTargetSum(nums, targetSum); System.out.println("Result: " + result); } public static int findTargetSum(int[] nums, int targetSum) { int windowSum = 0; // 窗口内的元素和 int windowStart = 0; // 窗口的起始位置 int minLength = Integer.MAX_VALUE; // 记录最小子数组长度 for (int windowEnd = 0; windowEnd < nums.length; windowEnd++) { // 窗口右移,加上当前元素 windowSum += nums[windowEnd]; // 当窗口内元素和大于等于目标和时,缩小窗口 while (windowSum >= targetSum) { // 更新最小子数组长度 minLength = Math.min(minLength, windowEnd - windowStart + 1); // 窗口左移,减去左边界元素 windowSum -= nums[windowStart]; windowStart++; } } return minLength != Integer.MAX_VALUE ? minLength : 0; } } ``` 以上示例中,我们使用滑动窗口算法来寻找数组中和大于等于目标和的最小子数组长度。通过维护一个窗口,不断向右移动,并根据窗口内元素和与目标和的比较来调整窗口的大小。最后返回最小子数组长度。 希望以上示例能帮助到您理解滑动窗口算法的使用。如果您有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值