题解 | #递减种子序列#

递减种子序列

https://www.nowcoder.com/practice/708a3a8603274fc7b5732c5e73617203

知识点:动态规划

思路:

  1. 首先,定义一个名为lengthOfLIS的静态方法,该方法接受一个整数数组作为参数,并返回一个整数。
  2. 初始化一个变量len为0,用于记录最长上升子序列的长度。
  3. 获取整数数组seeds的长度n
  4. 创建一个包含n+1个元素的整数数组q,用于记录上升子序列的元素。
  5. q[0]初始化为一个较大的值,这里使用2000000000
  6. 使用一个for循环,从0到n-1遍历整数数组seeds,并更新状态。
  7. 对于当前位置i,维护一个有序的上升子序列,使用二分查找将当前元素插入到正确的位置。使用两个指针l和r分别指向上升子序列的左右边界。在每一次循环中,用二分法找到[左闭右闭区间[l, r]的中间位置mid。如果q[mid]大于当前元素seeds[i],则将右边界r更新为mid - 1,否则将左边界l更新为mid。最终,当l和r相等时,插入位置为l或r,这取决于q[r]是否大于seeds[i]。
  8. 更新最长上升子序列的长度len为当前上升子序列的长度与len的较大值。
  9. 将当前元素seeds[i]插入到上升子序列的正确位置q[r + 1]
  10. 循环结束后,返回最长上升子序列的长度len作为最终结果。
  11. main方法中,创建一个示例用法,将一个整数数组作为参数传递给lengthOfLIS方法,并打印出最长上升子序列的长度。

编程语言:java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param seeds int整型一维数组
     * @return int整型
     */
    public static int lengthOfLIS(int[] seeds) {
        int len = 0, n = seeds.length;
        int[] q = new int[n + 1];
        q[0] = 2000000000;

        for (int i = 0; i < n; i++) {
            int l = 0, r = len;
            while (l < r) {
                int mid = (l + r + 1) >> 1;
                if (q[mid] > seeds[i]) l = mid;
                else r = mid - 1;
            }
            len = Math.max(len, r + 1);
            q[r + 1] = seeds[i];
        }

        return len;
    }
}

全部评论

相关推荐

学java时间比较短不到三个月,基本的技术栈都过了一遍就是都不太深,有个小项目。是继续找实习还是沉淀准备秋招呢?找实习的话会花很多时间在八股,放弃的话又怕秋招简历太难看。有无大佬支招
今天java了吗:1.一定要找实习,实习不一定要去,但是找实习过程中的面试经验和心态经验才是最重要的 2.八股本来就是大头,甚至比项目重要 3.这个时间段也是面试比较多的阶段,可以抓住机会锻炼。面试才会发现自己的不足,感觉自己会了和能给面试官娓娓道来是两码事
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务