Leetcode--300. 最长上升子序列
給定一個無序的整數數組,找到其中最長上升子序列的長度。
示例:
輸入: [10,9,2,5,3,7,101,18]
輸出: 4?
解釋: 最長的上升子序列是?[2,3,7,101],它的長度是 4。
說明:
可能會有多種最長上升子序列的組合,你只需要輸出對應的長度即可。
你算法的時間復雜度應該為?O(n2) 。
進階: 你能將算法的時間復雜度降低到?O(n log n) 嗎?
思路:從后往前推,依次比較觀察
動態方程:if(dp[j]>dp[i])? dp[i]=max(dp[j],dp[j]+1)
提交的代碼:
class Solution {
? ? public int lengthOfLIS(int[] nums) {
? ? ? ? ? int n =nums.length;
?? ? ? ? ? ?int dp[] = new int[n];
?? ? ? ? ? ?int i,j,max=0;
?? ? ? ? ? ?for(i=n-1;i>=0;i--)
?? ? ? ? ? ?{
?? ? ? ? ? ??? ?dp[i]=1;
?? ? ? ? ? ??? ?for(j=i;j<=n-1;j++)
?? ? ? ? ? ??? ?{
?? ? ? ? ? ??? ??? ?if(nums[j]>nums[i])
?? ? ? ? ? ??? ??? ?{
?? ? ? ? ? ??? ??? ??? ?dp[i] = java.lang.Math.max(dp[i], dp[j]+1);
?? ? ? ? ? ??? ??? ?}
?? ? ? ? ? ??? ??? ?
?? ? ? ? ? ??? ?}
?? ? ? ? ? ??? ?max = java.lang.Math.max(max, dp[i]);
?? ? ? ? ? ?}
?? ? ? ? ? ?return max;
? ? }
}
完整的代碼:
public class Solution300 {
?? ? public static int lengthOfLIS(int[] nums) {
?? ? ? ? ? ?int n =nums.length;
?? ? ? ? ? ?int dp[] = new int[n];
?? ? ? ? ? ?int i,j,max=0;
?? ? ? ? ? ?for(i=n-1;i>=0;i--)
?? ? ? ? ? ?{
?? ? ? ? ? ??? ?dp[i]=1;
?? ? ? ? ? ??? ?for(j=i;j<=n-1;j++)
?? ? ? ? ? ??? ?{
?? ? ? ? ? ??? ??? ?if(nums[j]>nums[i])
?? ? ? ? ? ??? ??? ?{
?? ? ? ? ? ??? ??? ??? ?dp[i] = java.lang.Math.max(dp[i], dp[j]+1);
?? ? ? ? ? ??? ??? ?}
?? ? ? ? ? ??? ??? ?
?? ? ? ? ? ??? ?}
?? ? ? ? ? ??? ?max = java.lang.Math.max(max, dp[i]);
?? ? ? ? ? ?}
?? ? ? ? ? ?return max;
?? ? ? ?}
?? ? public static void main(String[] args)
?? ? {
?? ??? ?int[] nums = {10,9,2,5,3,7,101,18};
?? ??? ?// int[] nums = {1,2};
?? ??? ? System.out.println(lengthOfLIS(nums));
?? ? }
}
?
總結
以上是生活随笔為你收集整理的Leetcode--300. 最长上升子序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css3 固定,CSS3 calc()不
- 下一篇: 第一章 计算机网络 1 计网体系结构的概