Number of Operations to Decrement Target to Zero - 滑动窗口

Number of Operations to Decrement Target to Zero - 滑动窗口

题目地址

https://binarysearch.com/problems/Number-of-Operations-to-Decrement-Target-to-Zero

题目描述

题目1
例子1

思路

题目要求去除数组nums的左右两端元素,并且去除的元素和为target,也就是留下中间的子数组,其和为sum(nums) - target;
题目还要求去除的元素个数越小越好,也就是留下的中间子数组的长度越大越好;
那么问题就转化为了找数组中间和为sum(nums) - target的最长子数组,令该和为我们的新目标new_target,步骤如下:

  1. 求出新目标new_target = sum(nums) - target,如果new_target == 0,也就是需要找到和为0的子数组,那就是把所有元素都去除了,返回数组长度n
  2. 接下来就是通过滑动窗口找子数组了,令左右指针指向滑动窗口的左右边界,从索引0开始滑窗
  3. right指针正常遍历数组,当滑动窗口内的和tmp_sum大于等于new_target的时候,开始缩紧左边界
  4. 如果tmp_sum正好与new_target相等,找到第一个符合要求的子数组,更新子数组最大长度max_len
  5. 左指针left右移,tmp_sum也相应的减小,当tmp_sum比new_target小或者left > right时循环结束,right继续遍历
  6. 最后返回去除的元素个数 n - max_len,如果max_len为0,说明没有找到符合要求的子数组,返回 - 1

代码(Python)

class Solution:
    def solve(self, nums, target):
        new_target = sum(nums) - target
        if new_target == 0:
            return len(nums)
        tmp_sum = 0
        max_len = 0
        left = 0
        for right, num in enumerate(nums):
            tmp_sum += num
            while tmp_sum >= new_target and left <= right:
                if tmp_sum == new_target:
                    max_len = max(max_len, right - left + 1)
                tmp_sum -= nums[left]
                left += 1
        return len(nums) - max_len if max_len else -1

代码(Java)

import java.util.*;

class Solution {
    public int solve(int[] nums, int target) {
        int n = nums.length;
        int newTarget = Arrays.stream(nums).sum() - target;
        if(newTarget == 0) return n;
        int left = 0, tmpSum = 0, maxLen = 0;
        for(int right = 0; right < n; right++){
            tmpSum += nums[right];
            while(tmpSum >= newTarget && left <= right){
                if(tmpSum == newTarget){
                    maxLen = Math.max(maxLen, right - left + 1);
                }
                tmpSum -= nums[left];
                left++;
            }
        }
        return maxLen == 0 ? -1 : n - maxLen;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
### TCP滑动窗口机制对网络时延和丢包率的影响 #### 滑动窗口机制概述 TCP滑动窗口是一种流量控制方法,允许发送方在等待确认之前连续发送多个数据段。这不仅提高了传输效率,还使得TCP能够在一定程度上适应不同网络条件下的性能变化。 #### 对时延的影响 当采用较大的滑动窗口尺寸时,可以减少因频繁等待ACK而产生的停顿时间,进而降低整体通信延迟[^4]。然而,在存在高延迟或不稳定连接的情况下,过大的窗口可能会导致过多未被确认的数据存在于网络中,一旦发生拥塞,则可能加剧延迟问题并引发更多超时重传事件[^1]。 #### 对丢包率的作用 合理设置的滑动窗口有助于平衡高效利用带宽与防止过度占用资源之间的矛盾。较小的窗口虽然能较好地避免造成严重拥塞,但也意味着较低的数据吞吐量;反之,过大则容易引起突发性的大量数据涌入网络,特别是在接近瓶颈链路段落处,增加了遭遇拥塞的可能性,最终提高丢包概率[^3]。 为了应对上述挑战,现代TCP实现通常会动态调整其滑动窗口大小——基于当前观测到的往返时间和丢失情况等因素作出决策,以此达到优化性能的目的。 ```python # Python伪代码展示简单的自适应窗口算法概念 class TCPSession: def __init__(self, initial_window_size=1): self.window_size = initial_window_size def adjust_window(self, rtt_sample, loss_detected): if not loss_detected and rtt_sample < threshold: # 如果RTT低于阈值且无丢包检测到,则适当增大窗口 self.window_size += increment_value elif loss_detected or rtt_sample > high_threshold: # 若有丢包或RTT过高,则减小窗口以缓解压力 self.window_size -= decrement_value ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值