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