Duotas masyvas arr[] dydžio N . Užduotis yra rasti gretimo pogrupio sumą a arr[] su didžiausia suma.
Pavyzdys:
Įvestis: arr = {-2,-3,4,-1,-2,1,5,-3}
Išvestis: 7
Paaiškinimas: Poskyris {4,-1, -2, 1, 5} turi didžiausią sumą 7.Įvestis: arr = {2}
Išvestis: 2
Paaiškinimas: Poskyris {2} turi didžiausią sumą 1.Įvestis: arr = {5,4,1,7,8}
Išvestis: 25
Paaiškinimas: Poskyris {5,4,1,7,8} turi didžiausią sumą 25.
Idėja apie Kadane'o algoritmas yra išlaikyti kintamąjį max_ending_čia kuri saugo didžiausią gretimų pogrupių sumą, kuri baigiasi dabartiniu indeksu ir kintamuoju max_iki šiol saugo didžiausią iki šiol rastų gretimų pogrupių sumą, kiekvieną kartą, kai yra teigiama sumos reikšmė max_ending_čia palyginkite su max_iki šiol ir atnaujinti max_iki šiol jei jis didesnis nei max_iki šiol .
Taigi pagrindinis Intuicija už nugaros Kadane'o algoritmas yra,
- Pogrupis su neigiama suma atmetamas ( kode priskirdami max_ending_here = 0 ).
- Nešiojame subarray, kol gaunama teigiama suma.
Kadane'o algoritmo pseudokodas:
Inicijuoti:
max_so_far = INT_MIN
maksimalus_pabaiga_čia = 0Ciklas kiekvienam masyvo elementui
(a) maks._pabaiga_čia = max_pabaiga_čia + a[i]
(b) if(max_so_far
max_so_far = max_baigiasi_čia
(c) if(maks._pabaiga_čia <0)
maksimalus_pabaiga_čia = 0
grąžinti max_so_far
Kadane'o algoritmo iliustracija:
Paimkime pavyzdį: {-2, -3, 4, -1, -2, 1, 5, -3}
Pastaba : paveikslėlyje max_so_far pavaizduotas Max_Sum ir max_ending_ here by Curr_Sum
Jei i=0, a[0] = -2
metus į ketvirčius
- max_ending_here = max_ending_here + (-2)
- Nustatykite max_ending_here = 0, nes max_ending_here <0
- ir nustatykite max_so_far = -2
Jei i=1, a[1] = -3
- max_ending_here = max_ending_here + (-3)
- Kadangi max_ending_here = -3 ir max_so_far = -2, max_so_far liks -2
- Nustatykite max_ending_here = 0, nes max_ending_here <0
Jei i = 2, a[2] = 4
- max_ending_here = max_ending_here + (4)
- maks._pabaiga_čia = 4
- max_so_far atnaujintas į 4, nes max_ending_here didesnis nei max_so_far, kuris iki šiol buvo -2
Jei i = 3, a[3] = -1
- max_ending_here = max_ending_here + (-1)
- maksimalus_pabaiga_čia = 3
Jei i = 4, a[4] = -2
- max_ending_here = max_ending_here + (-2)
- max_ending_here = 1
Jei i = 5, a[5] = 1
- max_ending_here = max_ending_here + (1)
- maks._pabaiga_čia = 2
Jei i = 6, a[6] = 5
- max_ending_here = max_ending_here + (5)
- max_ending_here =
- max_so_far atnaujintas į 7, nes max_ending_here yra didesnis nei max_so_far
Jei i = 7, a[7] = -3
- max_ending_here = max_ending_here + (-3)
- maks._pabaiga_čia = 4
Norėdami įgyvendinti idėją, atlikite šiuos veiksmus:
- Inicijuoti kintamuosius max_iki šiol = INT_MIN ir max_ending_čia = 0
- Paleiskite for kilpą iš 0 į N-1 ir kiekvienam indeksui i :
- Pridėkite arr[i] iki max_ending_ here.
- Jei max_so_far yra mažesnis nei max_ending_čia, tada atnaujinkite max_so_far iki max_ending_here .
- Jei max_ending_here <0, tada atnaujinkite max_ending_here = 0
- Grąžinti max_so_far
Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas.
C++ // C++ program to print largest contiguous array sum #include using namespace std; int maxSubArraySum(int a[], int size) { int max_so_far = INT_MIN, max_ending_here = 0; for (int i = 0; i < size; i++) { max_ending_here = max_ending_here + a[i]; if (max_so_far < max_ending_here) max_so_far = max_ending_here; if (max_ending_here < 0) max_ending_here = 0; } return max_so_far; } // Driver Code int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); // Function Call int max_sum = maxSubArraySum(a, n); cout << 'Maximum contiguous sum is ' << max_sum; return 0; }>
Java // Java program to print largest contiguous array sum import java.io.*; import java.util.*; class Kadane { // Driver Code public static void main(String[] args) { int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 }; System.out.println('Maximum contiguous sum is ' + maxSubArraySum(a)); } // Function Call static int maxSubArraySum(int a[]) { int size = a.length; int max_so_far = Integer.MIN_VALUE, max_ending_here = 0; for (int i = 0; i < size; i++) { max_ending_here = max_ending_here + a[i]; if (max_so_far < max_ending_here) max_so_far = max_ending_here; if (max_ending_here < 0) max_ending_here = 0; } return max_so_far; } }>
Python def GFG(a, size): max_so_far = float('-inf') # Use float('-inf') instead of maxint max_ending_here = 0 for i in range(0, size): max_ending_here = max_ending_here + a[i] if max_so_far < max_ending_here: max_so_far = max_ending_here if max_ending_here < 0: max_ending_here = 0 return max_so_far # Driver function to check the above function a = [-2, -3, 4, -1, -2, 1, 5, -3] print('Maximum contiguous sum is', GFG(a, len(a)))>
C# // C# program to print largest // contiguous array sum using System; class GFG { static int maxSubArraySum(int[] a) { int size = a.Length; int max_so_far = int.MinValue, max_ending_here = 0; for (int i = 0; i < size; i++) { max_ending_here = max_ending_here + a[i]; if (max_so_far < max_ending_here) max_so_far = max_ending_here; if (max_ending_here < 0) max_ending_here = 0; } return max_so_far; } // Driver code public static void Main() { int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 }; Console.Write('Maximum contiguous sum is ' + maxSubArraySum(a)); } } // This code is contributed by Sam007_>
Javascript >>PHP>>
Išvestis Maximum contiguous sum is 7>
Laiko sudėtingumas: O(N)
Pagalbinė erdvė: O(1)
Spausdinti didžiausios sumos gretimą porūšį:
Norint atspausdinti pogrupį su didžiausia suma, reikia išlaikyti pradėti indeksas maksimali_suma_pabaiga_čia esant dabartiniam indeksui, kad bet kada maksimali_suma_iki šiol yra atnaujintas su maksimali_suma_pabaiga_čia tada pogrupio pradžios ir pabaigos indeksas gali būti atnaujintas naudojant pradėti ir dabartinis indeksas .
Norėdami įgyvendinti idėją, atlikite šiuos veiksmus:
- Inicijuoti kintamuosius s , pradėti, ir galas su 0 ir max_iki šiol = INT_MIN ir max_ending_čia = 0
- Paleiskite for kilpą iš 0 į N-1 ir kiekvienam indeksui i :
- Pridėkite arr[i] iki max_ending_ here.
- Jei max_so_far yra mažesnis nei max_ending_here, atnaujinkite max_so_far į max_ending_čia ir atnaujinkite pradėti į s ir galas į i .
- Jei max_ending_here <0, tada atnaujinkite max_ending_here = 0 ir s su aš+1 .
- Spausdinti reikšmes iš indekso pradėti į galas .
Žemiau pateikiamas aukščiau pateikto požiūrio įgyvendinimas:
java skaityti csvC++
// C++ program to print largest contiguous array sum #include #include using namespace std; void maxSubArraySum(int a[], int size) { int max_so_far = INT_MIN, max_ending_here = 0, start = 0, end = 0, s = 0; for (int i = 0; i < size; i++) { max_ending_here += a[i]; if (max_so_far < max_ending_here) { max_so_far = max_ending_here; start = s; end = i; } if (max_ending_here < 0) { max_ending_here = 0; s = i + 1; } } cout << 'Maximum contiguous sum is ' << max_so_far << endl; cout << 'Starting index ' << start << endl << 'Ending index ' << end << endl; } /*Driver program to test maxSubArraySum*/ int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); maxSubArraySum(a, n); return 0; }>
Java // Java program to print largest // contiguous array sum import java.io.*; import java.util.*; class GFG { static void maxSubArraySum(int a[], int size) { int max_so_far = Integer.MIN_VALUE, max_ending_here = 0, start = 0, end = 0, s = 0; for (int i = 0; i < size; i++) { max_ending_here += a[i]; if (max_so_far < max_ending_here) { max_so_far = max_ending_here; start = s; end = i; } if (max_ending_here < 0) { max_ending_here = 0; s = i + 1; } } System.out.println('Maximum contiguous sum is ' + max_so_far); System.out.println('Starting index ' + start); System.out.println('Ending index ' + end); } // Driver code public static void main(String[] args) { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = a.length; maxSubArraySum(a, n); } } // This code is contributed by prerna saini>
Python # Python program to print largest contiguous array sum from sys import maxsize # Function to find the maximum contiguous subarray # and print its starting and end index def maxSubArraySum(a, size): max_so_far = -maxsize - 1 max_ending_here = 0 start = 0 end = 0 s = 0 for i in range(0, size): max_ending_here += a[i] if max_so_far < max_ending_here: max_so_far = max_ending_here start = s end = i if max_ending_here < 0: max_ending_here = 0 s = i+1 print('Maximum contiguous sum is %d' % (max_so_far)) print('Starting Index %d' % (start)) print('Ending Index %d' % (end)) # Driver program to test maxSubArraySum a = [-2, -3, 4, -1, -2, 1, 5, -3] maxSubArraySum(a, len(a))>
C# // C# program to print largest // contiguous array sum using System; class GFG { static void maxSubArraySum(int[] a, int size) { int max_so_far = int.MinValue, max_ending_here = 0, start = 0, end = 0, s = 0; for (int i = 0; i < size; i++) { max_ending_here += a[i]; if (max_so_far < max_ending_here) { max_so_far = max_ending_here; start = s; end = i; } if (max_ending_here < 0) { max_ending_here = 0; s = i + 1; } } Console.WriteLine('Maximum contiguous ' + 'sum is ' + max_so_far); Console.WriteLine('Starting index ' + start); Console.WriteLine('Ending index ' + end); } // Driver code public static void Main() { int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = a.Length; maxSubArraySum(a, n); } } // This code is contributed // by anuj_67.>
Javascript >>PHP>>
Išvestis Laiko sudėtingumas: O(n)
Pagalbinė erdvė: O(1) Naudojant didžiausią gretutinę porūšį Dinaminis programavimas :
Kiekvienam indeksui i DP[i] išsaugo didžiausią įmanomą didžiausios sumos gretimą posistemę, kuri baigiasi indeksu i, todėl DP[i] galime apskaičiuoti naudodami minėtą būsenos perėjimą:
- DP[i] = maks (DP[i-1] + arr[i], arr[i])
Žemiau pateikiamas įgyvendinimas:
C++ // C++ program to print largest contiguous array sum #include using namespace std; void maxSubArraySum(int a[], int size) { vector dp(dydis, 0); dp[0] = a[0]; int ans = dp[0]; už (int i = 1; i< size; i++) { dp[i] = max(a[i], a[i] + dp[i - 1]); ans = max(ans, dp[i]); } cout << ans; } /*Driver program to test maxSubArraySum*/ int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); maxSubArraySum(a, n); return 0; }>
Java import java.util.Arrays; public class Main { // Function to find the largest contiguous array sum public static void maxSubArraySum(int[] a) { int size = a.length; int[] dp = new int[size]; // Create an array to store intermediate results dp[0] = a[0]; // Initialize the first element of the intermediate array with the first element of the input array int ans = dp[0]; // Initialize the answer with the first element of the intermediate array for (int i = 1; i < size; i++) { // Calculate the maximum of the current element and the sum of the current element and the previous result dp[i] = Math.max(a[i], a[i] + dp[i - 1]); // Update the answer with the maximum value encountered so far ans = Math.max(ans, dp[i]); } // Print the maximum contiguous array sum System.out.println(ans); } public static void main(String[] args) { int[] a = { -2, -3, 4, -1, -2, 1, 5, -3 }; maxSubArraySum(a); // Call the function to find and print the maximum contiguous array sum } } // This code is contributed by shivamgupta310570>
Python # Python program for the above approach def max_sub_array_sum(a, size): # Create a list to store intermediate results dp = [0] * size # Initialize the first element of the list with the first element of the array dp[0] = a[0] # Initialize the answer with the first element of the array ans = dp[0] # Loop through the array starting from the second element for i in range(1, size): # Choose the maximum value between the current element and the sum of the current element # and the previous maximum sum (stored in dp[i - 1]) dp[i] = max(a[i], a[i] + dp[i - 1]) # Update the overall maximum sum ans = max(ans, dp[i]) # Print the maximum contiguous subarray sum print(ans) # Driver program to test max_sub_array_sum if __name__ == '__main__': # Sample array a = [-2, -3, 4, -1, -2, 1, 5, -3] # Get the length of the array n = len(a) # Call the function to find the maximum contiguous subarray sum max_sub_array_sum(a, n) # This code is contributed by Susobhan Akhuli>
C# using System; class MaxSubArraySum { // Function to find and print the maximum sum of a // subarray static void FindMaxSubArraySum(int[] arr, int size) { // Create an array to store the maximum sum of // subarrays int[] dp = new int[size]; // Initialize the first element of dp with the first // element of arr dp[0] = arr[0]; // Initialize a variable to store the final result int ans = dp[0]; // Iterate through the array to find the maximum sum for (int i = 1; i < size; i++) { // Calculate the maximum sum ending at the // current position dp[i] = Math.Max(arr[i], arr[i] + dp[i - 1]); // Update the final result with the maximum sum // found so far ans = Math.Max(ans, dp[i]); } // Print the maximum sum of the subarray Console.WriteLine(ans); } // Driver program to test FindMaxSubArraySum static void Main() { // Example array int[] arr = { -2, -3, 4, -1, -2, 1, 5, -3 }; // Calculate and print the maximum subarray sum FindMaxSubArraySum(arr, arr.Length); } }>
Javascript // Javascript program to print largest contiguous array sum // Function to find the largest contiguous array sum function maxSubArraySum(a) { let size = a.length; // Create an array to store intermediate results let dp = new Array(size); // Initialize the first element of the intermediate array with the first element of the input array dp[0] = a[0]; // Initialize the answer with the first element of the intermediate array let ans = dp[0]; for (let i = 1; i < size; i++) { // Calculate the maximum of the current element and the sum of the current element and the previous result dp[i] = Math.max(a[i], a[i] + dp[i - 1]); // Update the answer with the maximum value encountered so far ans = Math.max(ans, dp[i]); } // Print the maximum contiguous array sum console.log(ans); } let a = [-2, -3, 4, -1, -2, 1, 5, -3]; // Call the function to find and print the maximum contiguous array sum maxSubArraySum(a);>
Išvestis
Praktikos problema: Atsižvelgdami į sveikųjų skaičių masyvą (galbūt kai kurie elementai yra neigiami), parašykite C programą, kad sužinotumėte *didžiausią sandaugą*, galimą padauginus „n“ iš eilės einančių sveikųjų skaičių masyve, kur n ? ARRAY_SIZE. Taip pat atspausdinkite didžiausio produkto pogrupio pradžios tašką.