diff --git a/Binary-Search/RotatedSortedArraySearch.cpp b/Binary-Search/RotatedSortedArraySearch.cpp index 6d6ce5d..39f4175 100644 --- a/Binary-Search/RotatedSortedArraySearch.cpp +++ b/Binary-Search/RotatedSortedArraySearch.cpp @@ -1,105 +1,18 @@ // https://www.interviewbit.com/problems/rotated-sorted-array-search/ -int search1(const vector &arr, int low, int high, int B) -{ - if (low > high) return -1; - - int mid = (low) + (high-low)/2; - if (arr[mid] == B) return mid; - - if (arr[low] <= arr[mid]) - { - if (B >= arr[low] && B <= arr[mid]) - return search1(arr, low, mid-1, B); - - return search1(arr, mid+1, high, B); - } - - else if (arr[mid] <= arr[high]) - { - if (B >= arr[mid] && B <= arr[high]) - return search1(arr, mid+1, high, B); - - return search1(arr, low, mid-1, B); - } -} - - int Solution::search(const vector &A, int B) { - - int n = A.size(); - int i = search1(A, 0, n-1, B); - - if (i != -1) - return i; - else - return -1; - -} - -/* -int findPivot(const vector &A){ - int start = 0; - int end = A.size()-1; - int mid; int n = A.size(); - while(start <= end){ - mid = start + (end-start)/2; - int next = (mid+1)%n; - int prev = (mid-1+n)%n; - if(A[start] <= A[end]){ - return start; - } - else if((A[mid] <= A[prev]) && (A[mid] <= A[next])){ - return mid; - } - else if(A[mid] <= A[end]){ - end = mid-1; - } - else{ // A[mid] >= A[start] - start = mid+1; - } - } - return -1; -} - -int binarySearch(const vector &A, int start, int end, int key){ - int mid; - while(start <= end){ - mid = start + (end-start)/2; - if(A[mid] == key){ - return mid; - } - else if(A[mid] > key){ - end = mid-1; - } - else{ // A[mid] < key - start = mid+1; + int low = 0, high = n-1; + while(low<=high){ + int mid = low + (high-low)/2; + if(A[mid] == B) return mid; + else if(A[0]<=A[mid]){//i.e. left part is sorted + if(A[0]<=B && B < A[mid]) high = mid-1;//B lies on left part + else low = mid+1; + }else{//right part is sorted + if(A[mid] < B && B<=A[n-1]) low = mid+1;//B lies on right part + else high = mid-1; } } return -1; } - -int Solution::search(const vector &A, int B) { - // Do not write main() function. - // Do not read input, instead use the arguments to the function. - // Do not print the output, instead return values as specified - // Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details - - int pivot = findPivot(A); - if(B == A[pivot]){ - return pivot; - } - - int result = binarySearch(A, 0, pivot-1, B); - - if(result == -1){ - return binarySearch(A, pivot+1, A.size()-1, B); - } - - return result; - - // B < A[pivot] - -} -*/ diff --git a/Heaps-and-Maps/MergeKSortedLists.cpp b/Heaps-and-Maps/MergeKSortedLists.cpp index bd43194..36beb75 100644 --- a/Heaps-and-Maps/MergeKSortedLists.cpp +++ b/Heaps-and-Maps/MergeKSortedLists.cpp @@ -1,5 +1,3 @@ -// https://www.interviewbit.com/problems/merge-k-sorted-lists/ - /** * Definition for singly-linked list. * struct ListNode { @@ -8,49 +6,26 @@ * ListNode(int x) : val(x), next(NULL) {} * }; */ +struct Compare +{ + bool operator()(ListNode* const& a, ListNode* const& b) + { + return a->val > b->val; + } +}; ListNode* Solution::mergeKLists(vector &A) { - // Do not write main() function. - // Do not read input, instead use the arguments to the function. - // Do not print the output, instead return values as specified - // Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details - - map myMap; - - for(int i = 0; i < A.size(); i++){ - ListNode* curr = A[i]; - while(curr != NULL){ - int temp = curr->val; - if(myMap.find(temp) != myMap.end()){ - myMap[temp]++; - } - else{ - myMap[temp] = 1; - } - curr = curr->next; - } + priority_queue, Compare>pq; + if(A.empty()) return NULL; + ListNode* head = new ListNode(0); + ListNode* curr = head; + for(auto i = 0; i < A.size(); i++){ + pq.emplace(A[i]); } - - auto it = myMap.begin(); - - ListNode* head = NULL; - ListNode* curr = NULL; - - while(it != myMap.end()){ - while(it->second != 0){ - ListNode* list = new ListNode(it->first); - if(head == NULL){ - head = list; - curr = list; - } - else{ - curr->next = list; - curr = curr->next; - } - it->second--; - } - it++; + while (!pq.empty()){ + curr->next = pq.top(); + pq.pop(); + curr = curr->next; + if(curr->next) pq.emplace(curr->next); } - - return head; - + return head->next; }