和谐连续序列是指一个连续序列中元素的最大值和最小值之间的差值正好是1。
现在,给定一个整数数组,你需要在所有可能的连续子序列中找到最长的和谐连续子序列的长度。
一行整数数组,由空格分割
一行一个数字表示答案,即最长和谐连续子序列的长度
1 3 2 2 5 2 3 7
3
最长的连续和谐子序列是:[3,2,2]
1 3 2 2 1 1 2 3
5
最长的连续和谐子序列是:[2,2,1,1,2]
def judge(arr): # 使用O(n)的复杂度同时找出最大和最小值 n = len(arr) if n <= 1: return False # 初始化最大最小值 maximum, minimum = arr[0], arr[1] if maximum < minimum: maximum, minimum = minimum, maximum # 遍历数组更新最大和最小值 for i in range(2, n): if arr[i] > maximum: maximum = arr[i] elif arr[i] < minimum: minimum = arr[i] return maximum - minimum == 1 if __name__ == "__main__": arr = list(map(int, input().strip().split())) n = len(arr) maxLen = 0 # 遍历所有的连续子序列,如果满足和谐连续子序列的特征则更新长度 for left in range(n): for right in range(left + 1, n + 1): if judge(arr[left: right]): maxLen = max(maxLen, right - left) print(maxLen)
a=input() num=[int(n) for n in a.split()] result=[0 for i in range(len(num))] for i in range(len(num)): for j in range(i+1,len(num)): if (max(num[i:j+1])-min(num[i:j+1]))==1: result[i]=j-i+1 print(max(result))
//滑动窗口 let arr = readline(); arr = arr.split(' '); let maxLen=0, queue=[], curr=[]; arr.forEach(val => { queue[val]=queue[val] ? queue[val]+1 : 1; curr.push(val); let max=val, min=null; queue.forEach((v, index) => { if (min==null) min = index; if (max < index) max = index; }) while (max - min > 1 && curr.length>1) { let queueVal = curr.shift(); if (queue[queueVal] == 1) delete queue[queueVal]; else queue[queueVal]--; max=val, min=null; queue.forEach((v, index) => { if (min==null) min = index; if (max < index) max = index; }) } if (maxLen < curr.length && max-min==1) { maxLen = curr.length; } }) console.log(maxLen);
let arr=readline().split(' ').map(e=>Number(e)) let max=0 for(let i=0;i<arr.length-1;i++){ if(i!=0&&arr[i]==arr[i-1]) continue let flag=-1 let count=1 for(let j=i+1;j<arr.length;j++){ if(arr[i]==arr[j]){ count++ } else if(flag==-1&&Math.abs(arr[i]-arr[j])==1){ count++ flag=arr[i]>arr[j]?true:false } else if((flag==0&&arr[j]-arr[i]==1)||(flag==1&&arr[i]-arr[j]==1)){ count++ } else break } if(flag!=-1) max=Math.max(max,count) } console.log(arr.length==1?0:max)js简单思路,对比自己之前的代码简洁也快了不少,还是有进步的
//滑动窗口 const arr = readline().split(" ").map(item => parseInt(item)) const queue = [] if(arr.length <= 1) console.log(0) else{ let res = 0 let min = arr[0], max = arr[0]; queue.push(arr[0]) for(let i = 1;i<arr.length;i++){ queue.push(arr[i]) if(arr[i]>max) max = arr[i] if(arr[i]<min) min = arr[i] while(max - min > 1){ queue.shift(); min = Math.min(...queue) max = Math.max(...queue) } if(max - min === 1){ res = Math.max(res,queue.length) } } console.log(res) }
if len(A)==1: #处理特例 print(0) else: #非特例 i=0 j=0 maxc=0 while i<len(A): j=i t=[] tmin=A[j] tmax=A[j] while(tmax-tmin<=1 and j<len(A) and abs(A[j]-tmin)<=1 and abs(A[j]-tmax)<=1): t.append(A[j]) tmin=min(t) tmax=max(t) j=j+1 c=len(t) if len(set(t))==1: c=0 if c>maxc: maxc=c i=i+1 print(maxc)
let _str =readline(); let _strArr = _str.split(' '); let _resultArr = [0]; let _max = 0; for (let i = 0, len = _strArr.length - 1; i < len; i++) { _resultArr[i] = 0; for (let j = _strArr.length - 1; j > i; j--) { let _sliceArr = _strArr.slice(i, j + 1); if (Math.abs(Math.max.apply(null, _sliceArr) - Math.min.apply(null, _sliceArr)) !== 1) { continue; } else { _resultArr[i] = (j - i + 1)>_resultArr[i]?(j - i + 1):_resultArr[i]; } } } console.log(Math.max.apply(null, _resultArr));