Longest One

题目:
给一个stream,都是0或者1,求全为1的subsequence的最长长度。

解题思路:
这道题就是用start和end两个指针。

代码:

public int findLongestOne(int[] nums){
    int start = 0;
    int end = 0;
    int rst = 0;
    int len = nums.length;
    for(int i = 0; i <= len - 1; i++){
        if(nums[i] == 1 && (i == 0 || (nums[i - 1] == 0))){
            start = i;
        }
        if(nums[i] == 1 && (i == len - 1 || nums[i + 1] == 0)){
            end = i;
        }
        if(end >= start){
            rst = Math.max(end - start + 1, rst);
        }
    }
    return rst;
}

public static void main(String[] args){
    LongestOne longestOne = new LongestOne();
    int[] nums = {1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0};
    int rst = longestOne.findLongestOne(nums);
    System.out.println(rst);
}

Follow up:
如果可以flip一个0,这样的最长连续1的长度是多少。



public int merge(int[] nums){
    int start = 0;
    int end = 0;
    int rst = 0;
    int len = nums.length;
    List<Interval> list = new ArrayList<>();
    for(int i = 0; i <= len - 1; i++){
        if(nums[i] == 1 && (i == 0 || (nums[i - 1] == 0))){
            start = i;
        }
        if(nums[i] == 1 && (i == len - 1 || nums[i + 1] == 0)){
            end = i;
            Interval interval = new Interval(start, end);
            list.add(interval);
        }
    }
    for(int i = 1; i <= list.size() - 1; i++){
        Interval i1 = list.get(i - 1);
        Interval i2 = list.get(i);
        if(i1.end + 2 == i2.start){
            int len1 = i1.end - i1.start + 1;
            int len2 = i2.end - i2.start + 1;
            rst = Math.max(rst, len1 + len2 + 1);
        }
    }
    return rst;
}






Comments

Popular Posts