From 4a57f7737f1595024adf810dab4f035a3c9f4e8f Mon Sep 17 00:00:00 2001 From: Amit Suthar Date: Sat, 14 Oct 2023 20:50:38 +0530 Subject: [PATCH] Added a problem (#23) --- .../{ => Array}/01-arrays.md | 0 .../Array/02-second-largest.md | 88 +++++++++++++++++++ 2 files changed, 88 insertions(+) rename Data-Structures/Linear-Data-Structures/{ => Array}/01-arrays.md (100%) create mode 100644 Data-Structures/Linear-Data-Structures/Array/02-second-largest.md diff --git a/Data-Structures/Linear-Data-Structures/01-arrays.md b/Data-Structures/Linear-Data-Structures/Array/01-arrays.md similarity index 100% rename from Data-Structures/Linear-Data-Structures/01-arrays.md rename to Data-Structures/Linear-Data-Structures/Array/01-arrays.md diff --git a/Data-Structures/Linear-Data-Structures/Array/02-second-largest.md b/Data-Structures/Linear-Data-Structures/Array/02-second-largest.md new file mode 100644 index 0000000..fdb8e3a --- /dev/null +++ b/Data-Structures/Linear-Data-Structures/Array/02-second-largest.md @@ -0,0 +1,88 @@ +## Find Second largest element in the array + +Approach : + +1. Brute : Sort --> Traverse from n - 2 --> if (a[i] != largest) ==> secondLargest == a[i] + + Time Complexity : O(N Log N) + N ==> [Sort + Traversal] + +Code : + +```cpp +int secondLargest(vector &arr, int n){ + int secondLargest = -1; + sort(arr.begin(), arr.end()); // O(N Log N) + for (int i = n - 2; i >= 0; i++) { // O(N) + if (arr[i] != largest) { + secondLargest = arr[i]; + } + } + return secondLargest; +} +``` + +2. Better : Traverse for Largest --> set SecondLargest = -1 --> Traverse again --> if (arr[i] > SecondLargest and arr[i] != largest) ==> secondLargest == a[i] + + Time Complexity : O(2N) ==> [Two Traversals] + +Code : + +```cpp +int secondLargest(vector &arr, int n){ + int largest = arr[0]; + int secondLargest = -1; + for (int i = 0; i < n; i++){ // O(N) + if (arr[i] > largest){ + largest = arr[i]; + } + } + for (int i = 0; i < n; i++){ // O(N) + if (arr[i] > secondLargest && arr[i] != largest){ + secondLargest = arr[i]; + } + } + return secondLargest; +} +``` + +3. Optimal : set FirstElement to Largest, set SecondLargest = -1 --> Traverse from 0 to n --> if found an a[i] > Largest ==> SecondLargest == Largest and Largest == arr[i] --> else if found an a[i] < largest but a[i] > SecondLargest ==> SecondLargest == a[i] + + Time Complexity : O(N) ==> [Single Traversal] + +Code : + +```cpp +int secondLargest(vector &arr, int n){ + int largest = arr[0]; + int secondLargest = -1; + for (int i = 0; i < n; i++){ // O(N) + if (arr[i] > largest){ + secondLargest = largest; + largest = arr[i]; + } else if (arr[i] < largest && arr[i] > secondLargest){ + secondLargest = arr[i]; + } + } + return secondLargest; +} +``` + +--- + +### Bonus : Find Second Smallest + +```cpp +int secondLargest(vector &arr, int n){ + int smallest = arr[0]; + int secondSmallest = INT_MAX; + for (int i = 0; i < n; i++){ + if (arr[i] < smallest){ + secondSmallest = smallest; + smallest = arr[i]; + } else if (arr[i] != smallest && arr[i] < secondSmallest){ + secondSmallest = arr[i]; + } + } + return secondSmallest; +} +```