求最短连续子序列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最短连续子序列相关的知识,希望对你有一定的参考价值。
给定一个数串和一个数S,在数串中找出大于等于S的一个连续子列!且该子列是满足上述条件的最短子列!
数串数字个数N:10<N<100000,每个数小于10000,都是非负的。
输出最短连续的子序列的个数和子序列
Input:
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5
10 15
1 2 3 4 5 6 7 8 6 1
Output:
2
5 10
3
3 4 5
2
7 8
说明:因为子序列可能很多,我取的是最早出现的最大的那个序列
*******/
#include <iostream>
#include <cstdio>
using namespace std;
/*
有n个正整数组成一个 序列。给定整数s, 求长度最短的连续序列, 使他们的最大和大于或等于S。
其中10<n<100000 0<S<10^9 正整数不超过10000
*/
const int N=100005;
int a[N];
int inline min(int x,int y)
return x<y?x:y;
int main()
int n,s;
while(scanf("%d%d",&n,&s)!=EOF&&n)
for(int i=1;i<=n;++i)
scanf("%d",a+i);
a[i]+=a[i-1];
if(s>a[n])
printf("impossible\n");
continue;
int ans=n;
for(int i=0;i!=n;++i)
int l=i+1,r=n,mid;
if(a[r]-a[i]<s) break;
while(l<=r)
mid=(l+r)>>1;
if(a[mid]-a[i]>=s) r=mid-1;
else l=mid+1;
ans=min(ans,l-i);
printf("%d\n",ans);
int tmp=s-1,index=0;
for(int i=0;i<=n-ans;++i)
if(a[i+ans]-a[i]>tmp)
index=i;
tmp=a[i+ans]-a[i];
for(int i=0;i!=ans;++i)
printf("%d ",a[i+index+1]-a[i+index]);
printf("\n");
return 0;
最短无序连续子数组
题目描述
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
说明 :
- 输入的数组长度范围在 [1, 10,000]。
- 输入的数组可能包含重复元素 ,所以升序的意思是<=。
分析
这个题目我就比较偷懒了,直接排序然后找前后不一样的数的位置就行了
贴出代码
class Solution {
public int findUnsortedSubarray(int[] nums) {
int[] sortedArr = Arrays.copyOf(nums,nums.length);
Arrays.sort(sortedArr);
int i = 0,j = nums.length - 1;
while(nums[i] == sortedArr[i] && i < j)
i++;
while(nums[j] == sortedArr[j] && i < j)
j--;
if(i == j)
return 0;
else
return j - i + 1;
}
}
以上是关于求最短连续子序列的主要内容,如果未能解决你的问题,请参考以下文章
2022-09-19:给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 ““。 如果有不