300. Longest Increasing Subsequence
阿新 • • 發佈:2018-05-08
.com asi ++ 代碼 輸入 ret arrays solution binarys
該題是要求出字符串中最長的遞增子序列的長度。第一種方法的解決思路是動態規劃,定義一個與輸入數組等長的整型數組,用於記錄在該位置前的最長遞增子序列長度。
代碼如下:
1 class Solution {
2 public int lengthOfLIS(int[] nums) {
3
4 if(nums.length == 0){
5 return 0;
6 }
7
8 int[] fn = new int[nums.length];
9 int len = 1;
10
11 for(int i = 0 ; i < fn.length ; i++){
12 fn[i] = 1;
13 }
14
15
16 for(int i = 1 ; i < nums.length ; i++){
17 int maxvar = 0;
18 for(int j = 0; j < i ; j++){
19 if(nums[i] > nums[j]){
20 maxvar = Math.max(maxvar, fn[j]);
21 }
22 }
23 fn[i] = maxvar + fn[i];
24 len = Math.max(len, fn[i]);
25 }
26
27 return len;
28 }
29 }
還有一個就是使用二分查找的方法。
代碼如下:
1 class Solution {
2 public int lengthOfLIS(int[] nums) {
3
4 if(nums.length == 0){
5 return 0;
6 }
7
8 int[] fn = new int[nums.length];
9 int len = 0;
10
11 for(int num : nums){
12 int i = Arrays.binarySearch(fn, 0, len, num);
13
14 if( i < 0){
15 i = -(i+1);
16 }
17
18 fn[i] = num;
19 if( i == len){
20 len++;
21 }
22 }
23
24 return len;
25 }
26 }
END
300. Longest Increasing Subsequence