问题描述
小R有一个长度为 N 的数组 A,以及一个整数 X。他可以进行以下操作:选择一个索引 i(0 <= i <= N - 2),如果 A[i] 和 A[i+1] 都小于 X,则可以将这两个元素移除,并在它们的位置插入它们的和,即 A[i] + A[i+1]。
例如,如果数组是 [2, 6, 1, 9] 且选择 i = 1,则新数组将是 [2, 7, 9],因为 6 + 1 = 7。
你的任务是确定经过若干次操作后,是否可以将数组 A 缩减到长度为 1。如果可以返回 1,否则返回 0。
例如:当 N = 3,X = 5,A = [4, 3, 1] 时,可以按如下步骤操作:
- 第一步:选择
i = 1,新数组为[4, 4]。 - 第二步:选择
i = 0,新数组为[8]。由于数组的长度为1,因此答案是1。
测试样例
样例1:
输入:
N = 3,X = 5,A = [4, 3, 1]
输出:1
样例2:
输入:
N = 4,X = 10,A = [7, 2, 5, 1]
输出:1
样例3:
输入:
N = 5,X = 8,A = [3, 3, 2, 2, 1]
输出:1
public class Main {
public static int solution(int N, int X, int[] A) {
int i,minIndex,L=A.length;
for(i=1;i<L;i++){
minIndex=findMin(A);
if(A[minIndex]<=X&&A[minIndex-1]<=X){
A=delete(A,minIndex);
N--;
}
}
if(A.length==1){
return 1;
}
return 0;
}
public static int findMin(int[] A){
int L=A.length,i,min=Integer.MAX_VALUE,tmp,ans=0;
for(i=1;i<L;i++){
tmp=A[i]+A[i-1];
if(tmp<min){
min=tmp;
ans=i;
}
}
return ans;
}
public static int[] delete(int[] A,int index){
int i,L=A.length,newL=L-1;
int[] A1=new int[newL];
//删除index和他前面那个
int former=index-1,next=index+1;
for(i=0;i<former;i++){
A1[i]=A[i];
}
A1[former]=A[index]+A[former];
for(i=index;i<newL;i++){
A1[i]=A[i+1];
}
return A1;
}
public static void main(String[] args) {
System.out.println(solution(3, 5, new int[]{4, 3, 1}) == 1);
System.out.println(solution(4, 10, new int[]{7, 2, 5, 1}) == 1);
System.out.println(solution(5, 8, new int[]{3, 3, 2, 2, 1}) == 1);
}
}