Advertisement
maycod23

Sliding_Window

Apr 7th, 2023
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int max_klength_subarray_sum(vector<int>& v, int &n, int &k) {
  5. int ans = INT_MIN, tempsum = 0, s = 0;
  6. for (int i = 0; i < n; i++) {
  7. tempsum += v[i];//include this element
  8. if ((i - s + 1) == k) {//checking the window size
  9. ans = max(ans, tempsum);
  10. tempsum -= v[s];
  11. s++;
  12. }
  13. }
  14. return ans;
  15. }
  16.  
  17.  
  18.  
  19. vector<int> count_range_max_klength_subarray_sum(vector<int>& v, int &n, int&k) {
  20. int prevsum = -1, countans = 0, tempsum = 0, s = 0;
  21. pair<int, int> ans;
  22. for (int i = 0; i < n; i++) {
  23. tempsum += v[i];//include this element
  24. if ((i - s + 1) == k) {//checking the window size
  25. if (tempsum > prevsum) {
  26. prevsum = tempsum;
  27. countans = 1;
  28. ans.first = s, ans.second = i;
  29. }
  30. else if (tempsum == prevsum) {
  31. // ans.first = s, ans.second = i;
  32. countans++;
  33. }
  34. //tempsum-> sum of this window
  35. tempsum -= v[s];
  36. s++;
  37. }
  38. }
  39. return {countans, ans.first, ans.second};
  40. }
  41.  
  42.  
  43. pair<int, int> range_max_klength_subrray_sum(vector<int> &v, int &n, int &k) {/// nearer to end
  44. int prevsum = -1, tempsum = 0, s = 0;
  45. pair<int, int> ans;
  46. for (int i = 0; i < n; i++) {
  47. tempsum += v[i];
  48. if ((i - s + 1) == k) {
  49. //tempsum -> ans of this window
  50. if (tempsum >= prevsum) {
  51. prevsum = tempsum;
  52. ans.first = s, ans.second = i;
  53. }
  54. tempsum -= v[s];
  55. s++;
  56. }
  57. }
  58. return ans;
  59. }
  60.  
  61.  
  62.  
  63. pair<int, int> range_max_klength_subrray_sum_nearer_to_start(vector<int> &v, int &n, int &k) {
  64. int prevsum = -1, tempsum = 0, s = 0;
  65. pair<int, int> ans;
  66. for (int i = 0; i < n; i++) {
  67. tempsum += v[i];
  68. if ((i - s + 1) == k) {
  69. //tempsum -> ans of this window
  70. if (tempsum > prevsum) {
  71. prevsum = tempsum;
  72. ans.first = s, ans.second = i;
  73. }
  74. tempsum -= v[s];
  75. s++;
  76. }
  77. }
  78. return ans;
  79. }
  80.  
  81.  
  82.  
  83.  
  84. int main() {
  85. //given an n length array and k, you eed to find the max subarray sum of length k.
  86.  
  87. int n, k; cin >> n >> k;
  88. vector<int> v(n);
  89. for (int i = 0; i < n; i++) cin >> v[i];
  90.  
  91. cout << max_klength_subarray_sum(v, n, k);
  92.  
  93. vector<int> ans = count_range_max_klength_subarray_sum(v, n, k);
  94.  
  95.  
  96.  
  97.  
  98. return 0;
  99.  
  100. //follow-up questions
  101. /*
  102. 1.>find number of windows having maximum sum--> done
  103. 2.>find the range of window having maxium sum.--> done
  104. 3.>find the range of window having maximum sum, but it can be as nearer to the start.--> done
  105. 4.>find the range of window having maximum sum, but it can be as nearer to the end.-->
  106. */
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement