1. 程式人生 > >300. Longest Increasing Subsequence

300. Longest Increasing Subsequence

.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