最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)滑動窗口算法的示例代碼

 更新時間:2025年03月19日 08:45:21   作者:拾荒的小海螺  
滑動窗口算法是一種高效解決子數(shù)組、子字符串問題的算法,廣泛應(yīng)用于數(shù)據(jù)流處理、網(wǎng)絡(luò)限流和字符串操作等場景,本文將詳細解析滑動窗口算法的核心思想、常見問題及其實現(xiàn)方式,需要的朋友可以參考下

1、簡述

滑動窗口算法是一種高效解決子數(shù)組、子字符串問題的算法,廣泛應(yīng)用于數(shù)據(jù)流處理、網(wǎng)絡(luò)限流和字符串操作等場景。本文將詳細解析滑動窗口算法的核心思想、常見問題及其實現(xiàn)方式,并結(jié)合具體示例和實際應(yīng)用場景進行說明。

2、核心思想

滑動窗口是一種雙指針技術(shù),維護一個能夠在數(shù)據(jù)結(jié)構(gòu)上"滑動"的窗口(通常由兩個指針表示)。通過動態(tài)調(diào)整窗口的范圍,優(yōu)化計算的時間復雜度。

基本步驟:

  • 初始化兩個指針 left 和 right,分別表示窗口的左邊界和右邊界。
  • 移動 right 指針擴大窗口,直到窗口滿足問題的條件。
  • 在滿足條件時,移動 left 指針縮小窗口,尋找更優(yōu)解或移除不必要的元素。
  • 重復上述過程,直到 right 遍歷完整個數(shù)據(jù)結(jié)構(gòu)。

3、實踐樣例

以下是幾個經(jīng)典問題的滑動窗口解法:

3.1 找到字符串中所有不重復字符的最長子串

給定一個字符串,找出其中不含重復字符的最長子串。

import java.util.HashSet;

public class LongestSubstringWithoutRepeatingChars {
    public int lengthOfLongestSubstring(String s) {
        int left = 0, right = 0, maxLength = 0;
        HashSet<Character> window = new HashSet<>();

        while (right < s.length()) {
            char c = s.charAt(right);
            if (!window.contains(c)) {
                window.add(c);
                maxLength = Math.max(maxLength, right - left + 1);
                right++;
            } else {
                window.remove(s.charAt(left));
                left++;
            }
        }

        return maxLength;
    }

    public static void main(String[] args) {
        LongestSubstringWithoutRepeatingChars solution = new LongestSubstringWithoutRepeatingChars();
        System.out.println(solution.lengthOfLongestSubstring("abcabcbb")); // Output: 3
    }
}

3.2 滑動窗口最大值

給定一個數(shù)組 nums 和一個大小為 k 的窗口,找到每個滑動窗口中的最大值。

import java.util.ArrayDeque;
import java.util.Deque;

public class SlidingWindowMaximum {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length == 0) return new int[0];
        int n = nums.length;
        int[] result = new int[n - k + 1];
        Deque<Integer> deque = new ArrayDeque<>();

        for (int i = 0; i < nums.length; i++) {
            // 移除窗口左側(cè)已過期的元素
            if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
                deque.pollFirst();
            }

            // 移除所有比當前元素小的元素,因為它們不會成為最大值
            while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
                deque.pollLast();
            }

            deque.offerLast(i);

            // 當窗口達到大小 k 時,記錄最大值
            if (i >= k - 1) {
                result[i - k + 1] = nums[deque.peekFirst()];
            }
        }

        return result;
    }

    public static void main(String[] args) {
        SlidingWindowMaximum solution = new SlidingWindowMaximum();
        int[] result = solution.maxSlidingWindow(new int[]{1,3,-1,-3,5,3,6,7}, 3);
        for (int r : result) {
            System.out.print(r + " ");
        }
        // Output: 3 3 5 5 6 7
    }
}

4、應(yīng)用場景

滑動窗口算法因其高效性,在以下場景中應(yīng)用廣泛:

  • 字符串處理:
    查找字符串中的子串問題,例如最長無重復子串、包含所有指定字符的最短子串。

  • 數(shù)據(jù)流處理:
    在處理實時數(shù)據(jù)流時,通過滑動窗口維護最近的狀態(tài),例如計算實時統(tǒng)計信息(平均值、最大值等)。

  • 網(wǎng)絡(luò)限流:
    滑動窗口用于實現(xiàn)動態(tài)限流算法,限制一段時間內(nèi)的請求數(shù)量。

  • 數(shù)組處理:
    處理固定窗口大小的問題,例如滑動窗口最大值、最小值等。

5、總結(jié)

滑動窗口算法通過動態(tài)調(diào)整窗口范圍,極大地提高了求解某些問題的效率。在實際開發(fā)中,可以結(jié)合問題的特點靈活使用滑動窗口 技術(shù)解決各種復雜問題。如果你還沒有在項目中嘗試滑動窗口算法,那么不妨以本文提供的代碼示例為起點,嘗試將其應(yīng)用到實際場景中。

以上就是Java實現(xiàn)滑動窗口算法的示例代碼的詳細內(nèi)容,更多關(guān)于Java滑動窗口算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決IDEA無法下載maven依賴的問題

    解決IDEA無法下載maven依賴的問題

    這篇文章主要介紹了解決IDEA無法下載maven依賴的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 使用Swing繪制動態(tài)時鐘

    使用Swing繪制動態(tài)時鐘

    這篇文章主要為大家詳細介紹了使用Swing繪制動態(tài)時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java中的集合ArrayList類常用方法和遍歷

    Java中的集合ArrayList類常用方法和遍歷

    這篇文章主要介紹了Java中的集合ArrayList類常用方法和遍歷,ArrayList 是大小可變的數(shù)組的實現(xiàn),存儲在內(nèi)的數(shù)據(jù)稱為元素,此類提供一些方法來操作內(nèi)部存儲的元素, ArrayList中可不斷添加元素,其大小也自動增長,需要的朋友可以參考下
    2024-01-01
  • MyBatis在Spring環(huán)境下的事務(wù)管理

    MyBatis在Spring環(huán)境下的事務(wù)管理

    MyBatis的設(shè)計思想很簡單,可以看做是對JDBC的一次封裝,并提供強大的動態(tài)SQL映射功能。這篇文章主要介紹了MyBatis在Spring環(huán)境下的事務(wù)管理 ,需要的朋友可以參考下
    2019-07-07
  • Spring之借助Redis設(shè)計一個簡單訪問計數(shù)器的示例

    Spring之借助Redis設(shè)計一個簡單訪問計數(shù)器的示例

    本篇文章主要介紹了Spring之借助Redis設(shè)計一個簡單訪問計數(shù)器的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java常見報錯類型及解決方案詳細解析(從異常處理到錯誤排查)

    Java常見報錯類型及解決方案詳細解析(從異常處理到錯誤排查)

    這篇文章主要介紹了Java常見報錯類型及解決方案的相關(guān)資料,文中結(jié)合具體案例提供針對性解決方案,幫助開發(fā)者快速定位并修復問題,需要的朋友可以參考下
    2025-05-05
  • 利用EasyPOI實現(xiàn)多sheet和列數(shù)的動態(tài)生成

    利用EasyPOI實現(xiàn)多sheet和列數(shù)的動態(tài)生成

    EasyPoi功能如同名字,主打的功能就是容易,讓一個沒見接觸過poi的人員就可以方便的寫出Excel導出,Excel導入等功能,本文主要來講講如何利用EasyPOI實現(xiàn)多sheet和列數(shù)的動態(tài)生成,需要的可以了解下
    2025-03-03
  • 解決?IDEA?Maven?項目中"Could?not?find?artifact"?問題的常見情況和解決方案

    解決?IDEA?Maven?項目中"Could?not?find?artifact"?

    這篇文章主要介紹了解決IDEA Maven項目中Could not?find?artifact問題的常見情況和解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • MongoDB支持的java數(shù)據(jù)類型和測試例子

    MongoDB支持的java數(shù)據(jù)類型和測試例子

    這篇文章主要介紹了MongoDB支持的java數(shù)據(jù)類型和測試例子,MongoDB除了本身自有的數(shù)據(jù)類型外,還為較流行的編程語言定制了該語言的數(shù)據(jù)類型,需要的朋友可以參考下
    2014-05-05
  • Mybatis實現(xiàn)動態(tài)增刪改查功能的示例代碼

    Mybatis實現(xiàn)動態(tài)增刪改查功能的示例代碼

    這篇文章主要介紹了Mybatis實現(xiàn)動態(tài)增刪改查功能的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

东城区| 沭阳县| 郓城县| 安国市| 白玉县| 武山县| 连山| 东乡| 霍城县| 靖江市| 澎湖县| 民丰县| 梓潼县| 陇川县| 嘉定区| 九龙城区| 手机| 泸西县| 施甸县| 普安县| 吉水县| 威宁| 灵石县| 广宗县| 县级市| 定远县| 嘉义县| 贡觉县| 宣恩县| 巴东县| 博野县| 江达县| 呼和浩特市| 阿城市| 兴仁县| 东平县| 固原市| 从化市| 多伦县| 股票| 神农架林区|