最長上公升序列

2021-10-11 15:57:14 字數 3275 閱讀 3791

給定乙個未經排序的整數陣列,找到最長且連續的的遞增序列。

示例 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,因此輸出5

counts[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結尾的最長上公升子串行的長度,初始時...