网页优化最为重要的内容是,网站优化建设上海,微网站建设步骤,国外自助建站系统In the midst of winter, I found there was, within me, an invincible summer. - Albert Camus 1. 题目描述 2. 题目分析与解析
首先理解题意#xff0c;题目要求我们找到一个长度最小的 连续子数组 满足他们的和大于target#xff0c;需要返回的是子数组的…In the midst of winter, I found there was, within me, an invincible summer. - Albert Camus 1. 题目描述 2. 题目分析与解析
首先理解题意题目要求我们找到一个长度最小的 连续子数组 满足他们的和大于target需要返回的是子数组的长度。现在我们想一下对于一个根本不懂编程的人而言他会怎么解这个题目。因为算法无非就是不同的人根据题目采用的不同的方法去解决的本质上还是人来解决所以在每一个编程题目尤其是算法题目之前尝试想一想一个不懂编程的人会怎么完成这个题目会对我们的编程带来很大的帮助。
2.1 思路一——暴力求解
对于一个普通人而言一般而言他会从前向后首先从第一个位置从前向后加看到第几个数字满足条件再从第二个数字开始以此循环直到找到最小值。图解如下 对于这种解决方式而言是肯定能解决出题目的如果每一个位置都单纯从前向后遍历直到和大于target那么时间复杂度为O(n^2)。因为假设target很大没有解那么每一次都要遍历到结尾设数组长度为N那么时间复杂度如下 但是实际情况是加入第一次从开头遍历到结尾都没有大于target肯定就不需要继续遍历了因为所有数字的和都小于target那就代表没有解了。所以时间复杂度不会很大是可以通过的。
2.2 思路二——滑动窗口
以下内容引自数据结构和算法如侵权请告知立即删除
我们把数组中的元素不停的入队直到总和大于等于 s 为止接着记录下队列中元素的个数然后再不停的出队直到队列中元素的和小于 s 为止如果不小于 s也要记录下队列中元素的个数这个个数其实就是不小于 s 的连续子数组长度我们要记录最小的即可。接着再把数组中的元素添加到队列中……重复上面的操作直到数组中的元素全部使用完为止。 我着重想讲一下为什么这样做是可以得到更好的时间复杂度。 当目前的和小于target就一直向后加当我走到一个位置加起来大于等于target就需要进行处理而处理的内容就是将队列出队并且不断更新最小序列长度直到队列里的内容的和小于target再继续向后走。 我们知道队列的性质是先进先出之所以要出队到内部的和小于target是因为我们知道从队列头元素一直加到当前元素和才开始大于等于target。那么移除头元素就相当于从第二个元素开始相加一直加到当前元素我再判断它是否大于等于target。因此实际上每移除队列头部的一个元素就相当于起始点向后移动了一位从那一位加到当前位判断是否还是大于等于target如果满足那新的最小长度就可以更新直到小于target就停止。当发现现在队列又开始小于target了就说明从这个位置开始我又要在现在队列的基础上扩充直到大于等于target。 使用这种方法的好处就是减少了多次求和运算因为我每移除一个头部元素只需要进行一次减法也就相当于暴力求解中更换了一次开始位置。而如果队列中元素和小于target时再在现在和的基础上扩充只需要加一个数字也避免了前面重复的加法运算。所以这种方法能够很有效的提升时间复杂度。
3. 代码实现
3.1暴力求解 3.2 滑动窗口 4. 相关复杂度分析
4.1 暴力求解 时间复杂度O(n^2)其中 nnn 是数组的长度。需要遍历每个下标作为子数组的开始下标对于每个开始下标需要遍历其后面的下标得到长度最小的子数组。 空间复杂度O(1)。
4.2 滑动窗口 时间复杂度O(n)其中 n 是数组的长度。指针 point1和point2 最多各移动 n 次。 空间复杂度O(1)。