前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode209.滑动窗口算法原理图解(Kotlin语言):长度最小的子数组

LeetCode209.滑动窗口算法原理图解(Kotlin语言):长度最小的子数组

作者头像
一个会写诗的程序员
修改于 2023-09-21 09:00:21
修改于 2023-09-21 09:00:21
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

LeetCode209.滑动窗口算法原理图解(Kotlin语言):长度最小的子数组

题目:

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 sum ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。

示例:

输入: s = 7, nums = [2,3,1,2,4,3] 输出: 2 解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。 进阶:

如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

滑动窗口的算法原理图解

最小长度的子数组.gif

Sliding Window 算法思想源代码欣赏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    fun minSubArrayLen(s: Int, nums: IntArray): Int {
        var ans = Int.MAX_VALUE
        val n = nums.size

        var left = 0 // 左指针
        var right = 0 // 右指针
        var sum = 0 // 窗口中元素的和

        while (right < n) {
            // 窗口中的元素小于目标值,右指针向右移,扩大窗口
            sum += nums[right]
            right += 1

            // 窗口中的元素大于目标值,左指针向右移,缩小窗口
            while (sum >= s) {
                // 窗口中的元素大于目标值,此时的窗口长度为 ans
                ans = Math.min(ans, right - left)
                // 在左指针向右移1位之前, 先把 left 位置此时的值,从 sum 中减去
                sum -= nums[left]
                left += 1
            }
        }

        return if (ans != Int.MAX_VALUE) ans else 0
    }
}

算法复杂度:

时间复杂度: O(n) 空间复杂度: O(1)

相关源代码和空间时间复杂度分析:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package i

import kotlin.math.min

/**
 * @author: Jack
 * 2020-04-20 01:08
 */


/**
 * 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 sum ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。

示例: 

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。
进阶:

如果你已经完成了O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

/**
 * 常规思路:暴力破解
 *
 * 时间复杂度:O(n^3)

对数组里的每一个元素,我们从它开始枚举所有的子数组,需要的时间为 O(n^2)
将每一个子数组求和的时间复杂度为:O(n)。
所以总时间复杂度为:O(n^2 * n) = O(n^3)

空间复杂度:O(1)。只是用了常数个额外变量。

作者:LeetCode
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 */
fun minSubArrayLen1(s: Int, nums: IntArray): Int {
    var ans = Int.MAX_VALUE
    val n = nums.size
    for (i in 0 until n) {
        // break to here, i++
        for (j in i until n) {
            var sum = 0
            // 计算当前子数组的元素和
            for (k in i..j) {
                sum += nums[k]
            }

            if (sum >= s) {
                ans = min(ans, j - i + 1)
                break // Found the smallest subarray with sum>=s starting with index i, hence move to next index
            }
        }
    }
    return if (ans != Int.MAX_VALUE) ans else 0
}

/**
 * 滑动窗口:
 * 解题思路
思路:
当输出或比较的结果在原数据结构中是连续排列的时候,可以使用滑动窗口算法求解。
将两个指针比作一个窗口,通过移动指针的位置改变窗口的大小,观察窗口中的元素是否符合题意。

初始窗口中只有数组开头一个元素。
当窗口中的元素小于目标值,右指针向右移,扩大窗口。
当窗口中的元素大于目标值,比较当前窗口大小是否为最小值,左指针向右移,缩小窗口。

算法复杂度:

时间复杂度:O(n) 。每个指针移动都需要 O(n) 的时间。
每个元素至多被访问两次,一次被右端点访问,一次被左端点访问。
空间复杂度: O(1) ,  left,right,  sum, ans 以及 i这些变量只需要常数个空间。

作者:lxiaocode
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/java-209-chang-du-zui-xiao-de-zi-shu-zu-hua-dong-c/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 */
fun minSubArrayLen2(s: Int, nums: IntArray): Int {
    var ans = Int.MAX_VALUE
    val n = nums.size

    var left = 0 // 左指针
    var right = 0 // 右指针
    var sum = 0 // 窗口中元素的和

    while (right < n) {
        // 窗口中的元素小于目标值,右指针向右移,扩大窗口
        sum += nums[right]
        right += 1

        // 窗口中的元素大于目标值,左指针向右移,缩小窗口
        while (sum >= s) {
            // 窗口中的元素大于目标值,此时的窗口长度为 ans
            ans = min(ans, right - left)
            // 在左指针向右移1位之前, 先把 left 位置此时的值,从 sum 中减去
            sum -= nums[left]
            left += 1
        }
    }

    return if (ans != Int.MAX_VALUE) ans else 0
}

fun main() {
    val s = 7
    val nums = intArrayOf(2, 3, 1, 2, 4, 3)
    val s1 = minSubArrayLen1(s, nums)
    val s2 = minSubArrayLen2(s, nums)
    println("s1=$s1")
    println("s2=$s2")

}

Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.

Example:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: s = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: the subarray `[4,3]` has the minimal length under the problem constraint.

Follow up: If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(nlog n).

参考资料:

力扣(LeetCode) :https://leetcode-cn.com/problems/minimum-size-subarray-sum

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Linux基础03
第三位指定其他用户的权限。每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如6(4+2)代表有读写权,7(4+2+1)有读、写和执行的权限。
Dlimeng
2023/06/27
1580
linux每日命令(27):chmod命令
chmod命令用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
用户1214487
2018/12/18
8260
chmod命令用法linux,Linux下chmod命令详细介绍及用法举例[通俗易懂]
chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
全栈程序员站长
2022/11/10
2.4K0
Linux之chmod命令
[ugoa...][[+-=][rwxX]...][,...]或者数字权限777,755
入门笔记
2021/03/11
3.5K0
chmod命令用法举例「建议收藏」
chmod命令用于改变linux系统文件或目录的访问权限。 该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
全栈程序员站长
2022/09/07
7.4K0
Linux权限详解 命令之 chmod:修改权限
在这种使用方式中,首先我们需要了解数字如何表示权限。 首先,我们规定 数字 4 、2 和 1表示读、写、执行权限(具体原因可见下节权限详解内容),即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,如: rwx = 4 + 2 + 1 = 7 rw = 4 + 2 = 6 rx = 4 +1 = 5 即
用户1214487
2018/08/01
5.9K0
Linux权限详解 命令之 chmod:修改权限
Linux chmod命令
Linux chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令
狼啸风云
2021/05/13
4.7K0
Linux chmod命令
linux修改文件权限命令是什么_chown和chmod命令用法
Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
全栈程序员站长
2022/10/01
3.5K0
【Linux】ubuntu系统权限chmod的使用
sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)
蛮三刀酱
2019/09/10
2.5K0
linux如何修改文件或目录的权限(chmod)
chmod命令是linux上用于改变权限的命令,-R 是递归遍历子目录,因为你要操作的文件使用的*通配符。777,第一个7代表文件所属者的权限,第二个7代表文件所属者所在组的权限,第三个7代表其它用户的权限,7=4+2+1,在linux中权限是可以通过数字来描述的。具体表示如下: 4,执行时设置用户ID,用于授权给基于文件属主的进程,而不是给创建此进程的用户。 2,执行时设置用户组ID,用于授权给基于文件所在组的进程,而不是基于创建此进程的用户。 1,设置粘着位。 其次,chmod命令的详细使用如下,有
庞小明
2018/03/08
7.9K0
Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。
全栈程序员站长
2022/09/07
8.7K0
chmod 命令用法
指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [–help] [–version] mode file… 说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。 参数 : mode : 权限设定字串,格式如下 : [ugoa…][[±=][rwxX]…][,…],其中 u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。 +表示增加权限、- 表示取消权限、= 表示唯一设定权限。 r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 -c : 若该档案权限确实已经更改,才显示其更改动作 -f : 若该档案权限无法被更改也不要显示错误讯息 -v : 显示权限变更的详细资料 -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) –help : 显示辅助说明 –version : 显示版本 例 :将档案 file1.txt 设为所有人皆可读取 : chmod ugo+r file1.txt 将档案 file1.txt 设为所有人皆可读取 : chmod a+r file1.txt 将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 : chmod ug+w,o-w file1.txt file2.txt 将 ex1.py 设定为只有该档案拥有者可以执行 : chmod u+x ex1.py 此外chmod也可以用数字来表示权限如 chmod 777 file 语法为:chmod abc file 其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 r=4,w=2,x=1 若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=5。 例: chmod a=rwx file 和 chmod 777 file 效果相同 chmod ug=rwx,o=x file 和 chmod 771 file 效果相同
全栈程序员站长
2022/09/07
8400
chmod命令详细用法
指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [–help] [–version] mode file… 说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。 参数 : mode : 权限设定字串,格式如下 : [ugoa…][[+-=][rwxX]…][,…],其中 u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。 + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 -c : 若该档案权限确实已经更改,才显示其更改动作 -f : 若该档案权限无法被更改也不要显示错误讯息 -v : 显示权限变更的详细资料 -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) –help : 显示辅助说明 –version : 显示版本 范例 :将档案 file1.txt 设为所有人皆可读取 : chmod ugo+r file1.txt 将档案 file1.txt 设为所有人皆可读取 : chmod a+r file1.txt 将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 : chmod ug+w,o-w file1.txt file2.txt 将 ex1.py 设定为只有该档案拥有者可以执行 : chmod u+x ex1.py 将目前目录下的所有档案与子目录皆设为任何人可读取 : chmod -R a+r * 此外chmod也可以用数字来表示权限如 chmod 777 file 语法为:chmod abc file 其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 r=4,w=2,x=1 若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=7。 范例: chmod a=rwx file 和 chmod 777 file 效果相同 chmod ug=rwx,o=x file 和 chmod 771 file 效果相同 若用chmod 4755 filename可使此程序具有root的权限.
全栈程序员站长
2022/09/07
7200
Linux 命令(81)—— chmod 命令
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
恋喵大鲤鱼
2019/11/03
2.9K0
linux chmod,chown命令详解
linux chmod,chown命令详解 指令名称:chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。 利用 chmod 可以藉以控制档案如何被他人所存取。 mode 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...] u:表示该档案的拥有者 g: 表示与该档案的拥有者属于同一个群体
程序员鹏磊
2018/02/09
5.7K0
linux下的chmod,chown和chgrp
对于linux的权限掌握以下几个命令就可以非常熟练的操作系统中的各种权限了。 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉 以控制档案如何被他人所存取。 mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有 者,g 表示与该档案
cloudskyme
2018/03/20
2.9K0
《Linux命令行与shell脚本编程大全》 第七章理解Linux文件权限
Linux沿用了Unix文件权限的方法,允许用户和组根据每个文件和目录的安全性设置来访问文件。 用户权限通过创建用户时分配的用户ID(UID)来跟踪的。每个用户有唯一的ID,但是登录时用的不是UID,而是登录名。 7.1.1 /etc/passwd 文件 这个文件将用户的登录名匹配到对应的UID中,还包含了一些与用户相关的信息。 root用户账户是Linux系统的管理员,UID是0. 有些账户是系统账户:系统上运行的各种服务进程访问资源用的特殊账户。 所有运行在后台的服务都需要用一个系统用户账户登录到lin
xcywt
2018/01/11
1.5K0
《Linux命令行与shell脚本编程大全》 第七章理解Linux文件权限
Linux文件和目录常见的命令
我是用xmind 做的,这个图毕竟是截图出来的,很多地方会显得比较模糊,从框架上看内容还是挺多的,目前已经全面更新,针对粉丝提供免费下载服务,审核通过,粉丝即可下载
Gorit
2021/12/09
3.3K0
Linux文件和目录常见的命令
linux每日命令(22):find命令参数详解
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。 可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。 不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。
用户1214487
2018/12/13
1.5K0
Linux 命令 | 每日一学,文件目录特殊权限相关命令集锦
描述:相信各位看友都看了UP主上一篇《Linux运维学习之文件目录属性及权限管理笔记》了吧,此篇将针对文件目录特殊权限等相关命令进行详细讲解,包括文件基本权限与特殊权限。
全栈工程师修炼指南
2024/06/21
2750
Linux 命令 | 每日一学,文件目录特殊权限相关命令集锦
推荐阅读
相关推荐
Linux基础03
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档