题解 | #递减种子序列#
递减种子序列
https://www.nowcoder.com/practice/708a3a8603274fc7b5732c5e73617203
知识点:动态规划
思路:
- 首先,定义一个名为
lengthOfLIS的静态方法,该方法接受一个整数数组作为参数,并返回一个整数。 - 初始化一个变量
len为0,用于记录最长上升子序列的长度。 - 获取整数数组
seeds的长度n。 - 创建一个包含
n+1个元素的整数数组q,用于记录上升子序列的元素。 - 将
q[0]初始化为一个较大的值,这里使用2000000000。 - 使用一个
for循环,从0到n-1遍历整数数组seeds,并更新状态。 - 对于当前位置
i,维护一个有序的上升子序列,使用二分查找将当前元素插入到正确的位置。使用两个指针l和r分别指向上升子序列的左右边界。在每一次循环中,用二分法找到[左闭右闭区间[l, r]的中间位置mid。如果q[mid]大于当前元素seeds[i],则将右边界r更新为mid - 1,否则将左边界l更新为mid。最终,当l和r相等时,插入位置为l或r,这取决于q[r]是否大于seeds[i]。 - 更新最长上升子序列的长度
len为当前上升子序列的长度与len的较大值。 - 将当前元素
seeds[i]插入到上升子序列的正确位置q[r + 1]。 - 循环结束后,返回最长上升子序列的长度
len作为最终结果。 - 在
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;
}
}

