Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java에서 주어진 쿼리를 기반으로 배열을 하위 배열로 나눈 후의 최대 하위 배열 합계

<시간/>

우리에게는 두 개의 정수 배열이 주어졌습니다. 하나는 계산된 요소가 있고 다른 하나는 부분 집합을 만들기 위해 배열을 분할하는 데 필요한 분할 지점이 있으며 모든 분할에서 각 부분 집합의 합계를 계산하고 최대 부분 집합 합계를 반환해야 합니다.

예를 들어 이해합시다:-

입력 - int arr[] =int arr[] ={ 9, 4, 5, 6, 7 } int splitPoints[] ={ 0, 2, 3, 1 };

출력 − 각 분할 후 최대 하위 배열 합계 [22, 13, 9, 9]

설명 − 여기에서 분할 지점에 따라 배열을 나누고 각 분할 후 최대 부분 집합 합계를 구합니다.

첫 번째 분할 후 → {9} 및 {4,5,6,7}>> 최대 하위 배열 합계는 22

두 번째 분할 후 → {9}, {4,5} 및 {6,7}>> 최대 하위 배열 합계는 13

세 번째 분할 후 →{9}, {4,5}, {6} 및 {7}>> 최대 하위 배열 합계는 9

네 번째 분할 이후 →{9}, {4}, {5}, {6} 및 {7}>> 최대 하위 배열 합계는 - 9

입력 -int arr[] =int arr[] ={ 7, 8, 5, 9, 1 } int splitPoints[] ={ 1, 2, 0, 3 };

출력 −각 분할 후 최대 하위 배열 합계 [15, 115, 10, 9]

설명 −여기서 분할점에 따라 배열을 나누고 각 분할 후 최대 부분집합 합계를 구합니다.

첫 번째 분할 후 → {7,8} 및 {5,9,1}>> 최대 하위 배열 합계는 15입니다.

두 번째 분할 후 → {7,8}, {5} 및 {9,1}>> 최대 하위 배열 합계는 115입니다.

세 번째 분할 후 →{7}, {8}, {5} 및 {9,1}>> 최대 하위 배열 합계는 10입니다.

네 번째 분할 이후 →{7}, {8}, {5}, {9} 및 {1}>> 최대 하위 배열 합계는 9입니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다 -

  • main() 메소드부터 시작하겠습니다.

    • 주어진 길이의 입력 배열, 예를 들어 arr[] 및 splitPoints[]. 길이를 계산하고 메서드에 computeSubsetSum(arr.length, splitPoints.length, splitPoints, arr)으로 전달합니다.

  • computeSubsetSum()

    메소드 내부
    • 정수 배열을 sum[]으로 만들고 sum[0]을 arr[0]으로 설정합니다.

    • 루프 FOR를 i에서 1까지 배열의 길이까지 시작하고 sum[i]를 sum[i - 1] + arr[i]로 설정하고 temp[0]을 new subSets(0, n - 1, sum[n -)로 설정합니다. 1]).

    • 계속 t2.add(temp[0]) 및 t1.add(0)

      추가
    • splitPoints 배열의 길이까지 i에서 0까지 루프 FOR를 시작합니다. 루프 내에서 currentSplitPoint를 t1.floor(splitPoints[i])로 설정하고 t2에서 t2.remove(temp[currentSplitPoint])

      로 제거합니다.
    • 끝을 temp[currentSplitPoint].last로 설정하고 temp[currentSplitPoint]를 new subSets(currentSplitPoint, splitPoints[i], sum[splitPoints[i]]] - (currentSplitPoint ==0 ? 0 :sum[currentSplitPoint - 1]))<로 설정합니다. /P>

    • t2.add(temp[currentSplitPoint]) 및 temp[splitPoints[i] + 1] =new subSets(splitPoints[i] + 1, end, sum[end] - sum[splitPoints[i]])

    • t2.add(temp[splitPoints[i] + 1]), t1.add(currentSplitPoint) 및 t1.add(splitPoints[i] + 1)

      를 사용하여 추가
    • t2.first() 값을 출력합니다.

  • 클래스를 subSets로 만들고 first, last 및 value를 데이터 멤버로 선언하고 기본 생성자를 subSets(int f, int l, int v)로 정의하고 first를 f로, last를 l로, value를 v

    로 설정합니다.
  • Comparator

    를 구현하는 utilityComparator로 클래스를 만듭니다.
    • 비교로 공개 메소드를 생성하고 IF s2.value가 s1.value와 같지 않은지 확인한 다음 s2.value - s1.value를 반환합니다.

    • s1.first가 s2.first와 같지 않은지 확인한 다음 s2.first - s1.first를 반환합니다.

import java.io.IOException;
import java.io.InputStream;
import java.util.*;
class utilityComparator implements Comparator<subSets>{
   public int compare(subSets s1, subSets s2){
      if(s2.value != s1.value){
         return s2.value - s1.value;
      }
      if(s1.first != s2.first){
         return s2.first - s1.first;
      }
      return 0;
   }
}
class subSets{
   int first;
   int last;
   int value;
   subSets(int f, int l, int v){
      first = f;
      last = l;
      value = v;
   }
}
public class testClass{
   static void calculateSubsetSum(int n, int k, int splitPoints[], int arr[]){
      int sum[] = new int[n];
      sum[0] = arr[0];
      for (int i = 1; i < n; i++){
         sum[i] = sum[i - 1] + arr[i];
      }
      TreeSet<Integer> t1 = new TreeSet<>();
      TreeSet<subSets> t2 = new TreeSet<>(new utilityComparator());
      subSets temp[] = new subSets[n];
      temp[0] = new subSets(0, n - 1, sum[n - 1]);
      t2.add(temp[0]);
      t1.add(0);
      System.out.println("Maximum subarray sum after each split");
      for (int i = 0; i < k; i++){
         int currentSplitPoint = t1.floor(splitPoints[i]);
         t2.remove(temp[currentSplitPoint]);
         int end = temp[currentSplitPoint].last;
         temp[currentSplitPoint] = new subSets(currentSplitPoint, splitPoints[i], sum[splitPoints[i]] - (currentSplitPoint == 0 ? 0 : sum[currentSplitPoint - 1]));
         t2.add(temp[currentSplitPoint]);
         temp[splitPoints[i] + 1] = new subSets(splitPoints[i] + 1, end, sum[end] -       sum[splitPoints[i]]);
         t2.add(temp[splitPoints[i] + 1]);
         t1.add(currentSplitPoint);
         t1.add(splitPoints[i] + 1);
         System.out.println(t2.first().value);
      }
   }
   public static void main(String[] args){
      int arr[] = { 2, 1, 6, 8, 5, 10, 21, 13};
      int splitPoints[] = { 3, 1, 2, 0, 4, 5 };
      calculateSubsetSum(arr.length, splitPoints.length, splitPoints, arr);
   }
}

출력

위의 코드를 실행하면 다음과 같은 출력이 생성됩니다.

Maximum subarray sum after each split
49
49
49
49
44
34