LeetCode 1004 Max Consecutive Ones III (两点法 推荐)

Given an array A of 0s and 1s, we may change up to K values from 0 to 1.

Return the length of the longest (contiguous) subarray that contains only 1s. 

Example 1:

Input: A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
Output: 6
Explanation: 
[1,1,1,0,0,1,1,1,1,1,1]
Bolded numbers were flipped from 0 to 1.  The longest subarray is underlined.

Example 2:

Input: A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
Output: 10
Explanation: 
[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
Bolded numbers were flipped from 0 to 1.  The longest subarray is underlined.

Note:

  1. 1 <= A.length <= 20000
  2. 0 <= K <= A.length
  3. A[i] is 0 or 1 

题目链接:https://leetcode.com/problems/max-consecutive-ones-iii/

题目分析:记录到每个点时0的个数,然后两点法即可,区间内0的个数用nums0[r] - nums0[l - 1]算出

6ms,时间击败17%

class Solution {
    public int longestOnes(int[] A, int K) {
        int[] nums0 = new int[A.length + 1];
        int ans = 0, l = 0;
        for (int r = 0; r < A.length; r++) {
            nums0[r + 1] += nums0[r] + (A[r] == 0 ? 1 : 0);
            while (l <= r && nums0[r + 1] - nums0[l] > K) {
                l++;
            }
            ans = Math.max(ans, r - l + 1);
        }
        return ans;
    }
}

其实可以不用nums0数组,通过一个变量记录当前0的个数即可

4ms,时间击败81.7%

class Solution {
    public int longestOnes(int[] A, int K) {
        int nums0 = 0, ans = 0, l = 0;
        for (int r = 0; r < A.length; r++) {
            if (A[r] == 0) {
                nums0++;
            }
            if (nums0 > K) {
                if (A[l] == 0) {
                    nums0--;
                }
                l++;
            }
            if (nums0 <= K) {
                ans = Math.max(ans, r - l + 1);
            }
        }
        return ans;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值