Like CountDiv, I don't get why this problem is in the Codility Prefix Sum section. To solve it we could create our sort-of partial sums vector, but this would just add space complexity without giving anything back.
I guess the most interesting point in this problem is about the size of candidate subsequences. Let's say that we have spotted a good subsequence of four elements in our vector. We would always find a way of splitting it and get the same or better result by one of its subsequences, think for instance to { 1, 1, 1, 1 } . We can't always do that when the elements are just three, and this is as an example: { -12, 0, -12 }.
So, that's it. We need to check for 2- and 3- sized subsequences.
Here are a few GoogleTest C++11 test cases:
TEST(MinAvgTwoSlice, Given) { std::vector<int> input { 4, 2, 2, 5, 1, 5, 8 }; ASSERT_EQ(1, solution(input)); } TEST(MinAvgTwoSlice, Neg) { std::vector<int> input { 4, 2, 2, 5, -100, 5, -100 }; ASSERT_EQ(4, solution(input)); } TEST(MinAvgTwoSlice, Last) { std::vector<int> input { 100, 100, 1 }; ASSERT_EQ(1, solution(input)); }And this is my solution:
int solution(std::vector<int>& input) { assert(input.size() > 1); // 1 int index = 0; double minimal = std::numeric_limits<double>::max(); for(unsigned i = 0; i < input.size() - 2; ++i) // 2 { double candidate = (input[i] + input[i+1]) / 2.0; // 3 if(candidate < minimal) { index = i; minimal = candidate; } candidate = (input[i] + input[i+1] + input[i+2]) / 3.0; // 4 if(candidate < minimal) { index = i; minimal = candidate; } } double candidate = (input.back() + *(input.rbegin() + 1)) / 2.0; // 5 if(candidate < minimal) return input.size() - 2; return index; }1. Problem prerequisite.
2. Looping an all the elements but the last couple.
3. Check the current couple.
4. Check the current triplet.
5. Last couple.
No comments:
Post a Comment