LeetCode 862. 和至少为 K 的最短子数组


思路: 采用滑动窗口
注意点

  • 左边移动的时候,如果去掉的数是负数,那么右边游标要做回滚;
  • 右边的游标移动时,出现sum<=0,说明此次的计算没有意义,不要再进行下去;

代码

func shortestSubarray(A []int, K int) int {
	lA := len(A)
	sum := 0
	j := 0
	minL := -1
	for i := 0; i < lA; i++ {
		if i >= 1 {
			sum -= A[i-1]


			// 回滚, 如果删的是负数
			if  A[i-1] < 0 {
				for ; ; {
					if  j >i {
						sum -= A[j-1]
						j --
						if sum >= K {
							min := j - i
							if minL == -1 || (minL != -1&& min < minL) {
								minL = min
							}
						}

					} else {
						break
					}
				}
			}
		}

		// 此时够的,那么计算最小
		if sum >= K {
			min := j - i
			if minL == -1 || (minL != -1&& min < minL) {
				minL = min
			}
			continue
		}

		for {
			if j >= lA || sum < 0 {
				break
			}
			sum += A[j]
			j ++
			if sum >= K {
				min := j - i
				if minL == -1 || (minL != -1&& min < minL) {
					minL = min
				}
				break
			}
		}

	}
	return minL
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM