首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用二进制搜索的最长增长SubSequence

使用二进制搜索的最长增长SubSequence
EN

Stack Overflow用户
提问于 2016-10-07 14:45:27
回答 1查看 440关注 0票数 3

我正在尝试使用二进制搜索来实现最长增长的SubSequence。我已经对算法进行了编码,我的测试用例得到了满足,但是当我提交代码时,它对一些测试用例来说是失败的,比如下面的列表,

29471 5242 21175 28931 2889 7275 19159 1325 21773 6901,答案应该是4,但我得到5。下面是我的代码,

代码语言:javascript
复制
import java.util.Scanner;

public class LongestIncreasingSubSequence {

    public static int BS(int[] arr,int low,int high,int key){

        int mid;

        while ((high - low) > 1) {

            mid = (int) Math.ceil((low + high) / 2);

            if (arr[mid] >= key) {
                high = mid;
            } else {
                low = mid;
            }
        }
        return high;
    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n;
        n = sc.nextInt();
        int arr[] = new int[n];
        int LS[] = new int[arr.length];
        int count = 1;

        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        LS[0] = arr[0];

        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < LS[0]) {
                LS[0] = arr[i];
            } else if (arr[i] > LS[count-1]) {
                LS[count++] = arr[i];
            } else {
                LS[BS(arr,0,count-1,arr[i])] = arr[i];
            }
        }
        System.out.println(count);
    }
}

所以谁能事先告诉我我要去哪里wrong.Thanks吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 22:13:26

这里有一个bug:

LS[BS(arr,0,count-1,arr[i])] = arr[i];应该是

相反,我们需要更新LS[BS(LS,0,count-1,arr[i])] = arr[i];,因为我们需要更新每个递增子序列(即LS)的每个长度的最小值,而不是原始序列。通过此更改,它在您的测试用例上正常工作(我还没有在任何其他方面测试过它,但在我看来,算法现在看起来是正确的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39920015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档