給定乙個未經排序的整數陣列,找到最長且連續的的遞增序列。
示例 1:輸入:[1,3,5,4,7]輸出:3解釋:最長連續遞增序列是 [1,3,5], 長度為3。
儘管 [1,3,5,7] 也是公升序的子串行, 但它不是連續的,因為5和7在原陣列裡被4隔開。
示例 2:輸入:[2,2,2,2,2]輸出:1解釋:最長連續遞增序列是 [2], 長度為1
方法一:滑動視窗
滑動視窗中的元素都是連續遞增的,最長連續遞增序列的長度即為視窗的大小
public int findlengthoflcis(int nums)
int low=0;
int ans=1;
for (int i=1;i方法二:動態規劃
dp[i]表示以num[i]結尾的連續遞增序列的長度(以num[i]為基準,其前面的元素要比它更小)
public int findlengthoflcis(int nums)
int dp=new int[nums.length];
dp[0]=1;
int ans=1;
for (int i=1;inums[i-1]) else
ans=math.max(ans,dp[i]);
}return ans;
}
優化空間複雜度
不需要用乙個dp陣列,只需要用乙個變數記錄上乙個位置結束的遞增長度
public int findlengthoflcis(int nums)
int ans=1;
int count=1;
for (int i=1;inums[i-1]) else
ans=math.max(ans,count);
}return ans;
}
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:
輸入:說明:[10,9,2,5,3,7,101,18]
輸出:4解釋:最長的上公升子串行是[2,3,7,101],
它的長度是4
方法一:動態規劃
dp[i]表示num[0]...num[i]以num[i]作為最大元素的上公升子串行的長度
public int lengthoflis(int nums)
int dp=new int[nums.length];
arrays.fill(dp,1);
int ans=1;
for (int i=1;i=0 ; j--)
}ans=math.max(ans,dp[i]);
}return ans;
}
方法二:貪心+二分查詢
要使上公升子串行盡可能的長,則我們需要讓序列上公升得盡可能慢,因此我們希望每次在上公升子串行最後加上的那個數盡可能的小。
基於上面的貪心思路,我們維護乙個陣列 d[i](單調遞增),表示長度為 i 的最長上公升子串行的末尾元素的最小值,用len 記錄目前最長上公升子串行的長度,起始時 len為 1,d[0] = nums[0]
在遍歷過程中,如果nums[i]比d末尾數字大,增加nums[i]加到d中,len++,否則在d中找到大於num[i]的最小元素,將它改為nums[i]
public int lengthoflis(int nums)
int d = new int[nums.length];
int len = 1;
d[0] = nums[0];
for (int i = 1; i < nums.length; i++) else
}return len;
}public void binaryreplace(int d, int low, int high, int num) else
}d[pos] = num;
}
時間複雜度o(nlogn)
最長遞增子串行的個數
給定乙個未排序的整數陣列,找到最長遞增子串行的個數。
示例 1:
輸入:[1,3,5,4,7]輸出:2解釋:有兩個最長遞增子串行,分別是 [1, 3, 4, 7] 和[1, 3, 5, 7]示例 2:
輸入:[2,2,2,2,2]輸出:5解釋:最長遞增子串行的長度是1,並且存在5個子序列的長度為1,因此輸出5counts[i]表示以i結尾的最長遞增序列的種類數
在更新dp的時候:
最終再進行一次遍歷,如果dp[i]=maxlen,說明當前序列可構成最長遞增序列,ans+=counts[i]
public int findnumberoflis(int nums)
int dp = new int[nums.length];
int counts = new int[nums.length];
int maxlen = 1;
arrays.fill(dp, 1);
arrays.fill(counts, 1);
for (int i = 1; i < nums.length; i++) else if (dp[j] + 1 == dp[i]) }}
maxlen = math.max(maxlen, dp[i]);
}int ans = 0;
for (int i = 0; i < nums.length; i++)
}return ans;
}
最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
最長上公升子串行
最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...
最長上公升子串行
最長上公升子串行問題 給出乙個由n個數組成的序列x 1.n 找出它的最長單調上公升子串行。即求最大的m和a1,a2 am,使得a1動態規劃求解思路分析 o n 2 經典的o n 2 的動態規劃演算法,設a i 表示序列中的第i個數,f i 表示從1到i這一段中以i結尾的最長上公升子串行的長度,初始時...