11月3日面試題
題目
一個數(shù)組,找到其最長的連續(xù)升序子串徐绑。
例如:數(shù)組{1,3,5,4,7},結(jié)果:3掸绞。最長的連續(xù)升序子串是{1,3,5}泵三。
問題一耕捞,返回最長的連續(xù)升序子串的長度(LeetCode674. 最長連續(xù)遞增序列)
解析
從數(shù)組nums一個下標(biāo)i開始,向后尋找nums[j]>nums[j-1]所有元素烫幕,直達(dá)某一個下標(biāo)j俺抽,此時nums[j]<=nums[j-1]為止,i和j直接的元素就是一個升序的子串较曼,統(tǒng)計記錄這個長度是否遍歷到的最大值磷斧,如果是最大值,記錄下來捷犹。因為nums[j]<=nums[j-1]弛饭,所以j之前的元素開始不會再產(chǎn)生更長的增序子串,而且增序子串一定不再包括j-1和j萍歉,i從j開始繼續(xù)重復(fù)上面的步驟侣颂,直到數(shù)組nums遍歷完成。
代碼
public int findLengthOfLCIS(int[] nums) {
if(null == nums || nums.length == 0){
return 0;
}
int result = 0;
for(int i = 0;i < nums.length;){
int j = i + 1;
while(j < nums.length && nums[j] > nums[j-1]){
j++;
}
result = (j - i) > result ? (j - i) : result;
i = j;
}
return result;
}
問題二枪孩,返回最長的連續(xù)升序子串所有元素憔晒,也就是打印這個最長的連續(xù)升序子串
解析
與上面問題一的解析思路一樣,不同之處就是需要多定義兩個變量記錄下這個最長連續(xù)升序子串的起始和結(jié)束位置蔑舞。
代碼
//返回長度為2的數(shù)組拒担,記錄著最長的連續(xù)升序子串的開始下標(biāo)和結(jié)束下標(biāo)
public int[] findLengthOfLCIS(int[] nums) {
if(null == nums || nums.length == 0){
return 0;
}
int result = 0;
//長度為2的數(shù)組
int[] arr = {0, 0};
for(int i = 0;i < nums.length;){
int j = i + 1;
while(j < nums.length && nums[j] > nums[j-1]){
j++;
}
//記錄最長的連續(xù)升序子串的開始下標(biāo)和結(jié)束下標(biāo)
if((j - i) > result){
result = j - i;
arr[0] = i;
arr[1] = j;
}
i = j;
}
//返回最長的連續(xù)升序子串的開始下標(biāo)和結(jié)束下標(biāo),調(diào)用者進行子串的打印
return arr;
}