最大连续1的个数
1004. 最大连续1的个数 III - 力扣(LeetCode)
暴力枚举 (力扣无法过):
class Solution {
public int longestOnes(int[] nums, int k) {
int len = 0;
if (k >= nums.length) {
return nums.length;
}
for (int i = 0; i < nums.length; i++) {
int zeroCount = 0;
for (int j = i; j < nums.length; j++) {
if (nums[j] == 0 && k != 0) {
zeroCount++;
if (zeroCount > k) {
break;
}
len = Math.max(len, j - i + 1);
} else if (nums[j] == 0 && k == 0) {
break;
} else {
len = Math.max(len, j - i + 1);
}
}
}
return len;
}
}
滑动窗口:
class Solution {
public int longestOnes(int[] nums, int k) {
int len = 0;
int left = 0;
int right = 0;
int zeroCount = 0;
while (right < nums.length) {
// 进窗口:更新 zeroCount
if (nums[right] == 0) {
zeroCount++;
}
// 判断
while (zeroCount > k) {
// 出窗口
if (nums[left++] == 0) {
zeroCount--;
}
}
// 更新结果
len = Math.max(len, right - left + 1);
// 进窗口:
right++;
}
return len;
}
}
python :
class Solution(object):
# 最大连续 1 的 个数
def longestOnes(self, nums, k):
left, right = 0, 0
if k >= len(nums):
return len(nums)
zeroCount, length = 0, 0
while right < len(nums):
if nums[right] == 0:
zeroCount += 1
while zeroCount > k:
# 出窗口
if nums[left] == 0:
zeroCount -= 1
left += 1
# 更新结果
length = max(length, right - left + 1)
# 进窗口
right += 1
return length
将 x 减到 0 的最小操作数
1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)
public static int minOperations(int[] nums, int x) {
int sum = 0;
for (int num : nums) {
sum += num;
}
int left = 0;
int right = 0;
int target = sum - x;
if (target < 0) {
return -1;
}
int count = 0;
int len = Integer.MAX_VALUE;
while (right < nums.length) {
// 进窗口
count += nums[right];
while (count > target) {
// 出窗口
count -= nums[left++];
}
// 此时 count <= target
if (count == target) {
//更新结果
len = Math.min(len, nums.length - (right - left + 1));
}
right++;
}
return len == Integer.MAX_VALUE ? -1 : len;
}
python:
class Solution(object):
def minOperations(self, nums, x):
left, right = 0, 0
n = len(nums)
sum, count, length = 0, 0, 0x7fffffff
for number in nums:
sum += number
target = sum - x
if target < 0:
return -1
while right < n:
# 进窗口
count += nums[right]
# 出窗口
while count > target:
count -= nums[left]
left += 1
# 更新结果
if count == target:
length = min(length, n - (right - left + 1))
right += 1
return 0x7fffffff if length else length
# 更新结果
if count == target:
length = min(length, n - (right - left + 1))
right += 1
return 0x7fffffff if length else length