给你一个n个整数的序列S = s1,s2,...,sn。请计算一下 可以将S分成两部分:s1,s2,...,si和si + 1,si + 2,......,sn (1< = i< n)以这样的方式使得第一部分严格减小而第一部分严格减少 第二是严格增加一个。首先取n作为输入然后再取n 整数,输出是或否。
这是我试过的
import java.util.Scanner;
public class Sequence {
public static int c;
public static void main(String[] args) {
int n;
int count = 0;
Scanner s = new Scanner(System.in);
n = s.nextInt();
int a[] = new int [n];
for(int i = 0; i<n; i++) // loop for taking input
{
a[i] = s.nextInt();
}
for(int i = 0; i<n-2; i++) // loop for finding the minimum point
{
if(a[i]<a[i+2])
{ c = i; // associated minimum valued index to c
for( ; i<n-2; i++) /* loop for checking whether after that the array
{ is decreasing or not*/
if(a[i+1]<a[i+2])
{
count = count+1;
}
else
{
}
}
}
if(count == n-2-c)
{
System.out.println("YES");
}
else
{
System.out.println("NO");
}
}
}
此代码未在Hackerrank.com上传递1个测试用例,请提出一些解决方案。
答案 0 :(得分:1)
这样做的一个好方法是通过二分法搜索:
你将有三个变量:lowbound,middle,upperbound和 你从数组的中间开始,lowbounf = 0,upperbound = n-1。
接下来你将检查数组的线性传递,如果s1,s2,... smiddle严格减少并且smiddle,....,sn严格增加。如果是,那么middle是你的解决方案。
如果s1,s2,... smiddle没有严格的去除和清除,......,sn并没有严格地增加你没有解决方案。
如果s1,s2,... smiddle没有严格去除和smiddle,....,sn严格增加,然后uperbound = middle,middle =(upperbound + lowbound)/ 2再试一次。
如果s1,s2,... smiddle是严格的去除和smiddle,....,sn并没有严格增加,那么lowbound = middle,middle =(upperbound + lowbound)/ 2然后再试一次。
直到找到解决方案,或者发现没有解决方案或者直到lowbound = upperbound。
示例:
序列:7 8 5 1 2 3 4 5 6 7 8 middle = 5(元素3),lowbound = 0,upperbound = 10,7,8,5,4,1,2,3没有严格减少,而4,5,6,7,8严格增加。
所以:upperbound = 5,middle = 2(元素数组[middle] = 2),7,8,5严格减少,1,2,3,4,5,6,7,8严格增加因此解决方案是mid = 2.(注意中间= 2表示这是数组的第三个元素,第一个是数组[0],第二个是数组[1],第三个是数组[2] =数组[中] = 5 )。
上面的解决方案是尝试log n次(由于二进制搜索)来线性检查数组(每个线性检查是O(n))。所以这个解是O(n log n)。
答案 1 :(得分:0)
import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();int f=0;
int arr[]=new int[n];
for(int i=0;i<n;i++)
{
arr[i]=sc.nextInt();
}
int i=0;
for(i=0;i<n-1;i++)
{
if(arr[i]<arr[i+1])
{
break;
}
}
for(int j=i+1;j<n-1;j++)
if(arr[j]>arr[j+1])
f=1;
if(f==1)
System.out.println("false");
else
System.out.println("true");
}
}