class Solution {
public:
int longestSubarray(vector<int>& nums) {
}
};
1493. 删掉一个元素以后全为 1 的最长子数组
给你一个二进制数组 nums
,你需要从中删掉一个元素。
请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。
如果不存在这样的子数组,请返回 0 。
提示 1:
输入:nums = [1,1,0,1] 输出:3 解释:删掉位置 2 的数后,[1,1,1] 包含 3 个 1 。
示例 2:
输入:nums = [0,1,1,1,0,1,1,0,1] 输出:5 解释:删掉位置 4 的数字后,[0,1,1,1,1,1,0,1] 的最长全 1 子数组为 [1,1,1,1,1] 。
示例 3:
输入:nums = [1,1,1] 输出:2 解释:你必须要删除一个元素。
提示:
1 <= nums.length <= 105
nums[i]
要么是 0
要么是 1
。原站题解
java 解法, 执行用时: 3 ms, 内存消耗: 49.5 MB, 提交时间: 2022-12-05 16:18:28
class Solution { public int longestSubarray(int[] nums) { int max = 0, left = 0, right = 0; for(int i = 0; i < nums.length; i++){ if(nums[i] == 0){ left = right; right = 0; }else if(nums[i] == 1){ right ++; } max = left + right > max ? left + right : max; } return max == nums.length ? max - 1 : max; } }
python3 解法, 执行用时: 92 ms, 内存消耗: 16.9 MB, 提交时间: 2022-12-05 16:16:35
class Solution: def longestSubarray(self, nums: List[int]) -> int: ans = 0 p0 = p1 = 0 for num in nums: if num == 0: p1, p0 = p0, 0 else: p0 += 1 p1 += 1 ans = max(ans, p1) if ans == len(nums): ans -= 1 return ans
java 解法, 执行用时: 3 ms, 内存消耗: 50 MB, 提交时间: 2022-12-05 16:16:20
class Solution { public int longestSubarray(int[] nums) { int ans = 0; int p0 = 0, p1 = 0; for (int num : nums) { if (num == 0) { p1 = p0; p0 = 0; } else { ++p0; ++p1; } ans = Math.max(ans, p1); } if (ans == nums.length) { --ans; } return ans; } }
java 解法, 执行用时: 3 ms, 内存消耗: 48.9 MB, 提交时间: 2022-12-05 16:16:05
class Solution { public int longestSubarray(int[] nums) { int n = nums.length; int[] pre = new int[n]; int[] suf = new int[n]; pre[0] = nums[0]; for (int i = 1; i < n; ++i) { pre[i] = nums[i] != 0 ? pre[i - 1] + 1 : 0; } suf[n - 1] = nums[n - 1]; for (int i = n - 2; i >= 0; --i) { suf[i] = nums[i] != 0 ? suf[i + 1] + 1 : 0; } int ans = 0; for (int i = 0; i < n; ++i) { int preSum = i == 0 ? 0 : pre[i - 1]; int sufSum = i == n - 1 ? 0 : suf[i + 1]; ans = Math.max(ans, preSum + sufSum); } return ans; } }