From 65d8e73a0a3b710f543be415aef61388ad0c337a Mon Sep 17 00:00:00 2001 From: Manish Date: Sun, 12 Mar 2023 11:47:43 +1100 Subject: [PATCH] Design Pattern 12: Modified Binary Search | Problem: Find Peak Element --- 12_find_peak_element.cpp | 53 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 12_find_peak_element.cpp diff --git a/12_find_peak_element.cpp b/12_find_peak_element.cpp new file mode 100644 index 0000000..5c1660a --- /dev/null +++ b/12_find_peak_element.cpp @@ -0,0 +1,53 @@ +/* Problem: https://leetcode.com/problems/find-peak-element/ + */ + +#include +#include + +int solution(const std::vector &nums) { + if (nums.size() == 0) { + return -1; + } + if (nums.size() == 1) { + return 0; + }; + long long first = 0, last = nums.size() - 1, pi = last / 2; + while (true) { + if (pi == 0) { + if (nums[pi] > nums[pi + 1]) { + return pi; + } else { + first = pi + 1; + pi = ((last - first) / 2) + first; + continue; + } + } else if (pi == (long long)nums.size() - 1) { + if (nums[pi] > nums[pi - 1]) { + return pi; + } else { + last = pi - 1; + pi = ((last - first) / 2) + first; + continue; + } + } + if (nums[pi] < nums[pi - 1]) { + last = pi - 1; + } else if (nums[pi] < nums[pi + 1]) { + first = pi + 1; + } else { + return pi; + } + pi = ((last - first) / 2) + first; + } + + return pi; +} + +int main() { + std::vector nums1 = {1, 2, 3, 1}, nums2 = {1, 2, 1, 3, 5, 6, 4}; + int i1, i2; + i1 = solution(nums1); + std::cout << i1 << " : " << nums1[i1] << '\n'; + i2 = solution(nums2); + std::cout << i2 << " : " << nums2[i2] << '\n'; +} \ No newline at end of file