Added sliding window
This commit is contained in:
parent
65996765d1
commit
c2bdd92ec4
@ -44,13 +44,13 @@ To run the tests:
|
||||
#+end_src
|
||||
|
||||
* Plan
|
||||
** Arrays [2/6]
|
||||
** Arrays [3/6]
|
||||
- [X] Is Unique (CTCI: 1.1)
|
||||
- [X] Check permutation (CTCI: 1.2)
|
||||
- [ ] String Compression (CTCI: 1.6)
|
||||
- [ ] Rotate Matrix (CTCI: 1.7)
|
||||
- [ ] Zero Matrix (CTCI: 1.8)
|
||||
- [ ] Sliding Window ([[https://www.geeksforgeeks.org/window-sliding-technique/][GfG: Sliding Window Technique]])
|
||||
- [X] Sliding Window ([[https://www.geeksforgeeks.org/window-sliding-technique/][GfG: Sliding Window Technique]])
|
||||
** Linked Lists [1/6]
|
||||
- [X] Remove Duplicates (CTCI: 2.1)
|
||||
- [ ] Return Kth to Last (CTCI: 2.2)
|
||||
|
@ -4,3 +4,5 @@
|
||||
|
||||
bool IsUnique(const char* s, int len);
|
||||
bool CheckPermutation(const char* s1, const char* s2, size_t s1_len, size_t s2_len);
|
||||
int sliding_window_max_sum(int* array, int len, int k_len);
|
||||
int sliding_window_shortest_subarray(int* array,int len, int x);
|
||||
|
@ -1,5 +1,6 @@
|
||||
|
||||
chapter1_sources = ['is_unique.cpp', 'check_permutation.cpp']
|
||||
chapter1_sources = ['is_unique.cpp', 'check_permutation.cpp',
|
||||
'sliding_window.cpp']
|
||||
|
||||
chapter1_lib = static_library('chapter1',
|
||||
chapter1_sources)
|
||||
|
82
libs/chapter1/sliding_window.cpp
Normal file
82
libs/chapter1/sliding_window.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
#include "chapter1.hpp"
|
||||
|
||||
/**
|
||||
* \brief sliding_window_max_sum
|
||||
*
|
||||
* Detailed description
|
||||
*
|
||||
* \param array The input array
|
||||
* \param len The length of the input array
|
||||
* \param k_len The length of the subarray
|
||||
* \return return int The maximum found in the subarray
|
||||
*/
|
||||
int sliding_window_max_sum(int* array, int len, int k_len){
|
||||
int current_max = 0;
|
||||
int* window_beg = array;
|
||||
int* window_end = (array + k_len);
|
||||
int previous_beg = 0;
|
||||
// initial sum
|
||||
for (int i = 0; i < k_len; i++){
|
||||
current_max += array[i];
|
||||
}
|
||||
previous_beg = *window_beg;
|
||||
window_beg += 1;
|
||||
window_end += 1;
|
||||
|
||||
// iterate window
|
||||
int current_sum = current_max;
|
||||
while(window_end != (array + len - 1)){
|
||||
current_sum = current_sum - previous_beg + *window_end;
|
||||
if (current_sum > current_max){
|
||||
current_max = current_sum;
|
||||
}
|
||||
previous_beg = *window_beg;
|
||||
window_beg += 1;
|
||||
window_end += 1;
|
||||
}
|
||||
|
||||
return current_max;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief sliding_window_shortest_subarray
|
||||
*
|
||||
* Find the shortest subarray that is greater than or equal to x.
|
||||
*
|
||||
* \param array The intput array
|
||||
* \param len The length of the input array
|
||||
* \param x The threshold to compare to
|
||||
* \return return the length of the shortest subarray
|
||||
*/
|
||||
int sliding_window_shortest_subarray(int* array,int len, int x){
|
||||
|
||||
int* window_beg = &array[0];
|
||||
int* window_end = &array[1];
|
||||
int current_sum = array[0] + array[1];
|
||||
int min_len = len;
|
||||
int sub_array_len = len;
|
||||
|
||||
|
||||
while(window_beg != (array + len - 1)){
|
||||
if(current_sum < x){
|
||||
window_end += 1;
|
||||
current_sum += *window_end;
|
||||
}
|
||||
if (current_sum >= x){
|
||||
sub_array_len = window_end - window_beg + 1;
|
||||
if(sub_array_len < min_len){
|
||||
min_len = sub_array_len;
|
||||
}
|
||||
current_sum -= *window_beg;
|
||||
window_beg += 1;
|
||||
if(window_beg > window_end){
|
||||
window_end += 1;
|
||||
current_sum += *window_end;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return min_len;
|
||||
}
|
@ -32,6 +32,20 @@ TEST(ChapterOne, CheckPermutations){
|
||||
|
||||
}
|
||||
|
||||
TEST(ChapterOne, SubArraySum){
|
||||
// Not actually in CTCI but is related to arrays
|
||||
|
||||
// Prompt: Given an array, find the sum of all subarrays of length K
|
||||
// (fixed sliding window)
|
||||
int a1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||
CHECK_EQUAL(27, sliding_window_max_sum(a1, 11, 3));
|
||||
|
||||
// Prompt: Find the shortest subarray with a sum greater than or
|
||||
// equal to X (dynamic sliding window)
|
||||
int a2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
|
||||
CHECK_EQUAL(1, sliding_window_shortest_subarray(a2, 9, 7));
|
||||
}
|
||||
|
||||
// Chapter 2: Linked Lists ___________________________________________
|
||||
|
||||
TEST_GROUP(ChapterTwo){};
|
||||
|
Loading…
x
Reference in New Issue
Block a user