数组长度缩减到1

59 阅读2分钟

问题描述

小R有一个长度为 N 的数组 A,以及一个整数 X。他可以进行以下操作:选择一个索引 i0 <= 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 = 3X = 5A = [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);
    }
}