題意:有一組數,如,1,2,3,-2,4,6,10,求該組數中最長連續遞增子序列的個數,顯然這道題的答案是從-2到10一共4個數,所以結果爲4.
解析:這道題最直觀的方法就是用兩個嵌套的循環,遍歷的過程中,噹噹前數比上一個數大時,則計數變量加1,否則退出內層循環,將計數變量和當前最大連續遞增個數變量比較,當比其大時,重新賦值最大連續遞增個數變量。這種方法的時間複雜度顯然爲O(n^2)。
這裏我使用另外一種可以使得時間複雜度降至O(n)的方法:(結合代碼和註釋應該可以看懂,好睏,就不解釋了╮(╯▽╰)╭)
java代碼如下:
import java.util.Random;
public class SlopeUp {
public static void main(String[] args) {
int count=30;//測試30個數據
int[] nums=new int[count];
Random random=new Random();
for(int i=0;i<count;i++){
nums[i]=random.nextInt(100);
System.out.print(nums[i]+" ");
}
System.out.println();
new SlopeUp().process(nums);
}
private int[] a; //a[i]表示從開始到i最長連續遞增子序列個數,最後的結果爲:a[a.length-1]
private int[] b; //b[i]表示到當前i位置有多少個連續遞增個數,如-1,2,4,0,3 則b[2]=3;b[4]=2
public void process(int[] nums){
a=new int[nums.length];
b=new int[nums.length];
for(int i=1;i<nums.length;i++){
if(nums[i]>nums[i-1]){
b[i]=b[i-1]+1;
if(b[i]+1>a[i-1]){
System.out.println("The End Number Is:"+nums[i]);
a[i]=b[i]+1;
}else{
a[i]=a[i-1];
}
}else{
a[i]=a[i-1];
}
}
System.out.println(a[a.length-1]);
}
}