From 62ed023ed4a52962da3bd1e6ee5d67ad941ba43f Mon Sep 17 00:00:00 2001 From: harshgaud2918 <54628284+harshgaud2918@users.noreply.github.com> Date: Mon, 5 Oct 2020 10:30:58 +0530 Subject: [PATCH 1/2] Create MaximumSubarrayProblem.java --- Algorithms/MaximumSubarrayProblem.java | 61 ++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Algorithms/MaximumSubarrayProblem.java diff --git a/Algorithms/MaximumSubarrayProblem.java b/Algorithms/MaximumSubarrayProblem.java new file mode 100644 index 00000000..9462988c --- /dev/null +++ b/Algorithms/MaximumSubarrayProblem.java @@ -0,0 +1,61 @@ +import java.util.*; + +public class MaximumSubarrayProblem { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.println("Enter the no. of elements : "); + int n = sc.nextInt(); + + System.out.println("Enter " + n + " integers"); + int[] numbers = new int[n]; + for (int i = 0; i < n; i++) { + + numbers[i] = sc.nextInt(); + } + System.out.println("Given Array is "); + printArray(numbers); + + int maxSum = maximumSubArraySum(numbers, 0, n - 1); + System.out.println("Maximum SubArray Sum is : " + maxSum); + + } + + static void printArray(int arr[]) { + int n = arr.length; + for (int i = 0; i < n; ++i) + System.out.print(arr[i] + " "); + System.out.println(); + } + + static int maximumSubArraySum(int[] arr, int l, int h) { + if (l == h) { + return arr[l]; + } + + int m = (l + h) / 2; + + return Math.max(maximumCrossingSum(arr, l, m, h), + Math.max(maximumSubArraySum(arr, l, m), maximumSubArraySum(arr, m + 1, h))); + } + + static int maximumCrossingSum(int[] arr, int l, int m, int h) { + double negInf = Double.NEGATIVE_INFINITY; + int sum = 0; + int rightSum = (int) negInf; + int leftSum = (int) negInf; + for (int i = m; i >= l; i--) { + sum = sum + arr[i]; + if (sum > leftSum) + leftSum = sum; + } + sum = 0; + for (int i = m + 1; i <= h; i++) { + sum = sum + arr[i]; + if (sum > rightSum) + rightSum = sum; + } + return Math.max(leftSum + rightSum, Math.max(leftSum, rightSum)); + + } +} From 19c2990127364c21b794ded23a6748665d2ec78c Mon Sep 17 00:00:00 2001 From: harshgaud2918 <54628284+harshgaud2918@users.noreply.github.com> Date: Mon, 5 Oct 2020 10:46:56 +0530 Subject: [PATCH 2/2] Using Divide and Conquer. --- Algorithms/CountingInversionProblem.java | 91 ++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Algorithms/CountingInversionProblem.java diff --git a/Algorithms/CountingInversionProblem.java b/Algorithms/CountingInversionProblem.java new file mode 100644 index 00000000..7eacdcbf --- /dev/null +++ b/Algorithms/CountingInversionProblem.java @@ -0,0 +1,91 @@ +import java.util.Scanner; + +public class CountingInversionProblem { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.println("Enter the no. of elements : "); + int n = sc.nextInt(); + + System.out.println("Enter " + n + " integers"); + int[] numbers = new int[n]; + for (int i = 0; i < n; i++) { + + numbers[i] = sc.nextInt(); + } + System.out.println("Given Array is "); + printArray(numbers); + + int totalInversions = countingInversionUsingMergeSort(numbers, 0, n - 1); + System.out.println("No. Of Inversions are : " + totalInversions); + + } + + static void printArray(int arr[]) { + int n = arr.length; + for (int i = 0; i < n; ++i) + System.out.print(arr[i] + " "); + System.out.println(); + } + + static int countingInversionUsingMergeSort(int arr[], int l, int r) { + int inversionCount = 0; + if (l < r) { + int m = (l + r) / 2; + + inversionCount = countingInversionUsingMergeSort(arr, l, m); + inversionCount = inversionCount + countingInversionUsingMergeSort(arr, m + 1, r); + inversionCount = inversionCount + merge(arr, l, m, r); + + } + return inversionCount; + } + + static int merge(int arr[], int l, int m, int r) { + int count = 0; + int n1 = m - l + 1; + int n2 = r - m; + int L[] = new int[n1]; + int R[] = new int[n2]; + + for (int i = 0; i < n1; i++) { + L[i] = arr[l + i]; + } + for (int i = 0; i < n2; i++) { + R[i] = arr[m + 1 + i]; + } + + int i = 0, j = 0; + int k = l; + while (i < n1 && j < n2) { + if (L[i] <= R[j]) { + arr[k] = L[i]; + i++; + + } + + else { + arr[k] = R[j]; + count = count + (m + 1) - (l + i); + j++; + + } + k++; + } + + while (i < n1) { + arr[k] = L[i]; + i++; + k++; + } + + while (j < n2) { + arr[k] = R[j]; + j++; + k++; + } + return count; + + } + +}