【leetcode】300. 最长递增子序列

 

int lengthOfLIS(int* nums, int numsSize){
    int len = 1, n = numsSize;
    if (n == 0) {
        return 0;
    }
    int* d= (int*)calloc(n+1,sizeof(int));
    d[len] = nums[0];
    for (int i = 1; i < n; ++i) {
        if (nums[i] > d[len]) {
            d[++len] = nums[i];
        } else {
            int l = 1, r = len, pos = 0; // 如果找不到说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0
            while (l <= r) {
                int mid = (l + r) >> 1;
                if (d[mid] < nums[i]) {
                    pos = mid;
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            d[pos + 1] = nums[i];
        }
    }
    return len;
}

 

posted @ 2020-12-29 16:54  温暖了寂寞  阅读(49)  评论(0编辑  收藏  举报