├── Algorithms ├── Boyer Mores Voting Algorithm.cpp ├── Juggling Algorithm.cpp ├── Kadane's Algorithm.cpp └── Mores Voting Algorithm.cpp ├── Array ├── Complement.cpp ├── Find all missing numbers from a given sorted array.cpp ├── Find all missing numbers from a given unsorted array.cpp ├── Find the Missing Number.cpp ├── Find triplets with zero sum.cpp ├── Largest subarray with 0 sum.cpp ├── Lower Bound.cpp ├── Majority Element.cpp ├── Majority Element2.cpp ├── Merge Without Extra Space.cpp ├── Minimum Sum of Four Digit Number After Splitting Digits.cpp ├── Move all zeros to the end of array.cpp ├── Remove duplicate elements from sorted Array 2.cpp ├── Remove duplicate elements from sorted Array.cpp ├── Remove duplicate elements from unsorted Array.cpp ├── Rotate Array by d Elements.cpp ├── Subarrays with sum K.cpp └── Two Sum.cpp ├── Data Structures and Algorithms.jpeg ├── Errors.png ├── Matrix ├── Pascal's Triangles Nth Row.cpp └── Spiral Matrix.cpp ├── README.md ├── Recursion └── Repetitive Addition Of Digits.cpp ├── Searching ├── Binary Searching.cpp ├── Ceil in a Sorted Array.cpp ├── Count 1’s in a sorted binary array.cpp ├── Exponential Searching.cpp ├── Find K Rotation.cpp ├── Find Minimum in Rotated Sorted Array with Distinct Elements.cpp ├── Find Minimum in Rotated Sorted Array with Duplicates.cpp ├── Find Smallest Letter Greater Than Target.cpp ├── Find in Mountain Array.cpp ├── Find position of an element in a sorted array of infinite numbers.cpp ├── First and last occurrences of X Modularly.cpp ├── First and last occurrences of X.cpp ├── Floor in a Sorted Array.cpp ├── Interpolation Searching.cpp ├── Jump Searching.cpp ├── Linear Searching.cpp ├── Peak element.cpp ├── Search in Rotated Sorted Array with Duplicates.cpp └── Search in a Rotated Array with Distinct Elements.cpp ├── Sorting ├── Bubble Sorting Optimisefd for O(N) Sorted Elements.cpp ├── Bubble Sorting.cpp ├── Count Sorting.cpp ├── Defense of a Kingdom.cpp ├── Insertion Sorting.cpp ├── Selection Sorting.cpp └── Sorting with Comparators.cpp ├── String ├── Complement.cpp ├── Count Occurences of Anagrams.cpp ├── Palindrome String.cpp └── Using get and getline.cpp └── Time complex.png /Algorithms/Boyer Mores Voting Algorithm.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Approach - Boyer Mores Voting Algorithm 3 | Time Complexity : O(N) 4 | Space Complexity : O(1) 5 | */ 6 | #include 7 | using namespace std; 8 | void majorityElement(int arr[], int size){ 9 | int count1 = 0; 10 | int count2 = 0; 11 | int candidate1 = 0; 12 | int candidate2 = 0; 13 | for(int i=0; i v; 28 | count1 = 0; 29 | count2 = 0; 30 | for(int i=0; i size/3){ 38 | v.push_back(candidate1); 39 | } 40 | if(count2 > size/3){ 41 | v.push_back(candidate2); 42 | } 43 | if(v.size() == 0){ 44 | cout<<"-1"; 45 | } 46 | for(int i=0; i 7 | using namespace std; 8 | int findgcd(int a, int b){ 9 | if(b == 0){ 10 | return a; 11 | }else{ 12 | return findgcd(b, a % b); 13 | } 14 | } 15 | 16 | void rotateArray(int arr[], int size, int rotateBy){ 17 | int gcd = findgcd(size, rotateBy); 18 | for(int i=0; i= size){ 24 | k = k - size; 25 | } 26 | if(k == i){ 27 | break; 28 | } 29 | arr[j] = arr[k]; 30 | j = k; 31 | } 32 | arr[j] = temp; 33 | } 34 | for(int i=0; i 7 | using namespace std; 8 | 9 | int maxSubarraySum(int arr[], int size){ 10 | int curr_sum = 0; 11 | int max_sum = INT_MIN; 12 | for(int i=0; imax_sum){ 15 | max_sum = curr_sum; 16 | } 17 | if(curr_sum<0){ 18 | curr_sum = 0; 19 | } 20 | } 21 | return max_sum; 22 | } 23 | 24 | int main(){ 25 | int arr[] = {1, 2, -3, 4, 5, 6, -7, -8, 9}; 26 | int n = sizeof(arr) / sizeof(arr[0]); 27 | cout< size/2){ 26 | return candidate; 27 | }else{ 28 | return -1; 29 | } 30 | } 31 | 32 | int main(){ 33 | int arr[] = {3, 1, 3, 3, 2}; 34 | int n = sizeof(arr) / sizeof(arr[0]); 35 | cout< 9 | using namespace std; 10 | vector findRange(string str, int size){ 11 | int l = 0; 12 | int ans_l, ans_r; 13 | int maxDiff = 0; 14 | int zeroCount = 0, oneCount = 0; 15 | for(int i=0; i maxDiff) { 27 | ans_l = l; 28 | ans_r = i; 29 | maxDiff = zeroCount - oneCount; 30 | } 31 | } 32 | } 33 | if(maxDiff == 0){ 34 | return {-1}; 35 | } 36 | return {ans_l + 1, ans_r + 1}; 37 | } 38 | 39 | int main(){ 40 | string str = "111100010"; 41 | int n = sizeof(str) / sizeof(str[0]); 42 | vector v = findRange(str, n); 43 | cout< 8 | using namespace std; 9 | void printMissingElements(int arr[], int size){ 10 | int temp = 0; 11 | for(int i=arr[0]; i<=arr[size - 1]; i++){ 12 | if(arr[temp] == i){ 13 | temp++; 14 | }else{ 15 | cout< 8 | using namespace std; 9 | void printMissingElements(int arr[], int size){ 10 | for(int i=0; i 0){ 13 | arr[temp] *= -1; 14 | } 15 | } 16 | for(int i=0; i 0){ 18 | cout< 8 | using namespace std; 9 | int getMissingNo(int arr[], int size){ 10 | sort(arr, arr + size); 11 | for(int i=0; i 33 | using namespace std; 34 | int getMissingNo(int arr[], int size){ 35 | int totalSum = (size * (size + 1)) / 2; 36 | for(int i=0; i 8 | using namespace std; 9 | bool findTriplets(int arr[], int size){ 10 | sort(arr, arr + size); 11 | int c = size - 1; 12 | while(arr[c] != 0){ 13 | int a = 0; 14 | int b = c - 1; 15 | while(a < b){ 16 | if(arr[a] + arr[b] + arr[c] == 0){ 17 | return true; 18 | }else if(arr[a] + arr[b] + arr[c] > 0){ 19 | b--; 20 | }else{ 21 | a++; 22 | } 23 | } 24 | } 25 | return false; 26 | } 27 | 28 | int main(){ 29 | int arr[] = {0, -1, 2, -3, 1}; 30 | int n = sizeof(arr) / sizeof(arr[0]); 31 | cout< 8 | using namespace std; 9 | int findSubArraySum(int arr[], int size){ 10 | int count = 0; 11 | int maxCount = 0; 12 | int sum = 0; 13 | unordered_map mpp; 14 | for(int i=0; i 9 | using namespace std; 10 | 11 | int lowerBound(int arr[], int size, int x){ 12 | int lb = -1; 13 | int start = 0; 14 | int end = size - 1; 15 | while(start <= end){ 16 | int mid = start + (end - start) / 2; 17 | if(arr[mid] > x){ 18 | end = mid - 1; 19 | } 20 | else{ 21 | lb = arr[mid]; 22 | start = mid + 1; 23 | } 24 | } 25 | return lb; 26 | } 27 | 28 | int main(){ 29 | int arr[] = {-2, 3, 4, -1, 5, -12, 6, 1, 3}; 30 | int n = sizeof(arr)/sizeof(int); 31 | 32 | // Lower bound is applied on shorted array 33 | sort(arr, arr + n); 34 | 35 | int x = -3; 36 | int lb = lowerBound(arr, n, x); 37 | cout< N/2 3 | Approach - Using unordered_map 4 | Time Complexity : O(N) or worst case O(N^2) 5 | Space Complexity : O(N) 6 | */ 7 | #include 8 | using namespace std; 9 | 10 | int majorityElement(int arr[], int size){ 11 | unordered_map mpp; 12 | for(int i=0; i size/2){ 15 | return arr[i]; 16 | } 17 | } 18 | return -1; 19 | } 20 | 21 | int main(){ 22 | int arr[] = {3, 1, 3, 3, 2}; 23 | int n = sizeof(arr) / sizeof(arr[0]); 24 | cout< N/2 29 | Approach - Mores Voting Algorithm 30 | Time Complexity : O(N) 31 | Space Complexity : O(1) 32 | */ 33 | int majorityElement(int arr[], int size){ 34 | int count = 0; 35 | int candidate = 0; 36 | for(int i=0; i size/2){ 53 | return candidate; 54 | }else{ 55 | return -1; 56 | } 57 | } 58 | 59 | int main(){ 60 | int arr[] = {3, 1, 3, 3, 2}; 61 | int n = sizeof(arr) / sizeof(arr[0]); 62 | cout< N/2 3 | Approach - Using unordered_map 4 | Time Complexity : O(N) or worst case O(NlogN) 5 | Space Complexity : O(N) 6 | */ 7 | #include 8 | using namespace std; 9 | void majorityElement(int arr[], int size){ 10 | unordered_map mpp; 11 | vector v; 12 | for(int i=0; i size/3){ 15 | v.push_back(arr[i]); 16 | } 17 | } 18 | for(int i=0; i N/2 31 | Approach - Boyer Mores Voting Algorithm 32 | Time Complexity : O(N) 33 | Space Complexity : O(1) 34 | */ 35 | #include 36 | using namespace std; 37 | void majorityElement(int arr[], int size){ 38 | int count1 = 0; 39 | int count2 = 0; 40 | int candidate1 = 0; 41 | int candidate2 = 0; 42 | for(int i=0; i v; 57 | count1 = 0; 58 | count2 = 0; 59 | for(int i=0; i size/3){ 67 | v.push_back(candidate1); 68 | } 69 | if(count2 > size/3){ 70 | v.push_back(candidate2); 71 | } 72 | if(v.size() == 0){ 73 | cout<<"-1"; 74 | } 75 | for(int i=0; i 7 | using namespace std; 8 | 9 | void merge(int arr1[], int arr2[], int n, int m){ 10 | int gap = ceil((float)(m + n) / 2); 11 | while(gap > 0){ 12 | int i = 0; 13 | int j = gap; 14 | while(j < (m + n)){ 15 | if(j < n && arr1[i] > arr1[j]){ 16 | swap(arr1[i], arr1[j]); 17 | }else if(i < n && j >= n && arr1[i] > arr2[j - n]){ 18 | swap(arr1[i], arr2[j - n]); 19 | }else if(i >= n && j >= n && arr2[i - n] > arr2[j - n]){ 20 | swap(arr2[i - n], arr2[j - n]); 21 | } 22 | i++; 23 | j++; 24 | } 25 | if(gap == 1){ 26 | gap = 0; 27 | }else{ 28 | gap = ceil((float)gap / 2); 29 | } 30 | } 31 | } 32 | 33 | int main(){ 34 | int arr1[] = {1, 3, 5, 7}; 35 | int arr2[] = {0, 2, 6, 8, 9}; 36 | int n, m; 37 | n = sizeof(arr1) / sizeof(arr1[0]); 38 | m = sizeof(arr2) / sizeof(arr2[0]); 39 | merge(arr1, arr2, n, m); 40 | for(int i=0; i 7 | using namespace std; 8 | 9 | int minimumSum(int num) { 10 | int arr[4]; 11 | for(int i=0; i<4; i++){ 12 | arr[i] = num%10; 13 | num = num/10; 14 | } 15 | sort(arr, arr+4); 16 | int a = arr[0] * 10 + arr[2]; 17 | int b = arr[1] * 10 + arr[3]; 18 | return a + b; 19 | } 20 | 21 | int main(){ 22 | int num = 2932; 23 | cout< 8 | using namespace std; 9 | 10 | void pushZerosToEnd(int arr[], int size){ 11 | int count = 0; 12 | for(int i=0; i 11 | using namespace std; 12 | int removeDuplicates(int arr[], int size){ 13 | if(size <= 2){ 14 | return size; 15 | } 16 | int newArrayCount = 2; 17 | for(int i=2; i 8 | using namespace std; 9 | int removeDuplicates(int arr[], int size){ 10 | if(size == 0 || size == 1){ 11 | return size; 12 | } 13 | int j = 0; 14 | for(int i=0; i 14 | using namespace std; 15 | void removeDuplicates(int arr[], int size){ 16 | map mpp; 17 | for(int i=0; i 8 | using namespace std; 9 | void rotateArray(int arr[], int size, int rotateBy){ 10 | while(rotateBy--){ 11 | int temp = arr[0]; 12 | for(int i=0; i 37 | using namespace std; 38 | int findgcd(int a, int b){ 39 | if(b == 0){ 40 | return a; 41 | }else{ 42 | return findgcd(b, a % b); 43 | } 44 | } 45 | 46 | void rotateArray(int arr[], int size, int rotateBy){ 47 | int gcd = findgcd(size, rotateBy); 48 | for(int i=0; i= size){ 54 | k = k - size; 55 | } 56 | if(k == i){ 57 | break; 58 | } 59 | arr[j] = arr[k]; 60 | j = k; 61 | } 62 | arr[j] = temp; 63 | } 64 | for(int i=0; i 85 | using namespace std; 86 | void rotateArray(int arr[], int size, int rotateBy){ 87 | reverse(arr, arr + rotateBy); 88 | reverse(arr + rotateBy, arr + size); 89 | reverse(arr, arr + size); 90 | for(int i=0; i 8 | using namespace std; 9 | int findSubArraySum(int arr[], int size, int findNum){ 10 | int count = 0; 11 | for(int i=0; i 38 | using namespace std; 39 | int findSubArraySum(int arr[], int size, int findNum){ 40 | int sum = 0; 41 | int count = 0; 42 | unordered_map mpp; 43 | for(int i=0; i 8 | using namespace std; 9 | bool hasArrayTwoCandidates(int arr[], int size, int x) { 10 | unordered_map mpp; 11 | for(int i=0; i 8 | using namespace std; 9 | #define MOD 1000000007 10 | 11 | vector pascalTriangle(int n){ 12 | vector> ans(n); 13 | for(int i=0; i &ans){ 25 | for(auto &x : ans){ 26 | cout< 8 | using namespace std; 9 | vector spirallyTraverse(vector> matrix){ 10 | vector v; 11 | int n = matrix.size(); 12 | int m = matrix[0].size(); 13 | int startRow = 0; 14 | int endRow = n - 1; 15 | int startColumn = 0; 16 | int endColumn = m - 1; 17 | 18 | while(startRow <= endRow && startColumn <= endColumn){ 19 | for(int column = startColumn; column <= endColumn; column++){ 20 | v.push_back(matrix[startRow][column]); 21 | } 22 | 23 | for(int row = startRow + 1; row <= endRow; row++){ 24 | v.push_back(matrix[row][endColumn]); 25 | } 26 | 27 | for(int column = endColumn - 1; column >= startColumn; column--){ 28 | if(startRow == endRow){ 29 | break; 30 | } 31 | v.push_back(matrix[endRow][column]); 32 | } 33 | 34 | for(int row = endRow - 1; row >= startRow + 1; row--){ 35 | if(startColumn == endColumn){ 36 | break; 37 | } 38 | v.push_back(matrix[row][startColumn]); 39 | } 40 | 41 | startRow++; 42 | endColumn--; 43 | endRow--; 44 | startColumn++; 45 | } 46 | return v; 47 | } 48 | 49 | int main(){ 50 | vector> matrix = { 51 | {1, 2, 3, 4}, 52 | {5, 6, 7, 8}, 53 | {9, 10, 11, 12}, 54 | {13, 14, 15,16} 55 | }; 56 | vector v = spirallyTraverse(matrix); 57 | for(int i = 0; i < v.size(); i++){ 58 | cout< 8 | using namespace std; 9 | int singleDigit(long long number) 10 | { 11 | int sum = 0; 12 | while(number) 13 | { 14 | sum += (number % 10); 15 | number /= 10; 16 | } 17 | if(sum < 10) 18 | return sum; 19 | else 20 | return singleDigit(sum); 21 | } 22 | 23 | int main(){ 24 | long long num = 98; 25 | cout< 8 | using namespace std; 9 | int binarySearching(int arr[], int size, int target) { 10 | int start = 0; 11 | int end = size - 1; 12 | while(start <= end){ 13 | int middle = start + (end - start) / 2; 14 | if(arr[middle] == target){ 15 | return middle + 1; 16 | }else if(arr[middle] > target){ 17 | end = middle - 1; 18 | }else if(arr[middle] < target){ 19 | start = middle + 1; 20 | } 21 | } 22 | return -1; 23 | } 24 | 25 | int main(){ 26 | int arr[] = {1, 2, 3, 4, 5}; //Sorted 27 | int n = sizeof(arr) / sizeof(arr[0]); 28 | int target = 4; 29 | int result = binarySearching(arr, n, target); 30 | if(result == -1){ 31 | cout<<"Element is not present in array!"; 32 | }else{ 33 | cout<<"Element is present at index "< 45 | using namespace std; 46 | int binarySearching(int arr[], int start, int end, int target){ 47 | if(start <= end){ 48 | int middle = start + (end - start) / 2; 49 | if(arr[middle] == target){ 50 | return middle + 1; 51 | }else if(arr[middle] > target){ 52 | return binarySearching(arr, start, middle - 1, target); 53 | }else if(arr[middle] < target){ 54 | return binarySearching(arr, middle + 1, end, target); 55 | } 56 | } 57 | return -1; 58 | } 59 | 60 | int main(){ 61 | int arr[] = {1, 2, 3, 4, 5}; //Sorted 62 | int n = sizeof(arr) / sizeof(arr[0]); 63 | int target = 4; 64 | int result = binarySearching(arr, 0, n-1, target); 65 | if(result == -1){ 66 | cout<<"Element is not present in array!"; 67 | }else{ 68 | cout<<"Element is present at index "< 8 | using namespace std; 9 | 10 | int findCeil(int arr[], int size, int target){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(start <= end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] < target){ 16 | start = middle + 1; 17 | }else if(arr[middle] > target){ 18 | end = middle - 1; 19 | }else{ 20 | return middle; 21 | } 22 | } 23 | return start; 24 | } 25 | 26 | 27 | int main(){ 28 | int arr[] = {1, 2, 8, 10, 11, 12, 19}; 29 | int n = sizeof(arr) / sizeof(arr[0]); 30 | int X = 0; 31 | cout<< findCeil(arr, n, X); 32 | return 0; 33 | } -------------------------------------------------------------------------------- /Searching/Count 1’s in a sorted binary array.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Count 1’s in a sorted binary array 3 | Approach - Binary Searching until found the last 1 4 | Time Complexity < O(logN) 5 | Space Complexity : O(1) 6 | */ 7 | #include 8 | using namespace std; 9 | 10 | int countOnes(int arr[], int size){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(start <= end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] < 1){ 16 | end = middle - 1; 17 | }else if(arr[middle] > 1){ 18 | start = middle + 1; 19 | }else{ 20 | if(middle == size - 1 || arr[middle + 1] == 0){ 21 | return middle + 1; 22 | }else{ 23 | start = middle + 1; 24 | } 25 | } 26 | } 27 | } 28 | 29 | int main(){ 30 | int arr[] = {1, 1, 1, 1, 0 , 0}; //Sorted 31 | int n = sizeof(arr) / sizeof(arr[0]); 32 | int result = countOnes(arr, n); 33 | cout< 8 | using namespace std; 9 | 10 | int binarySearching(int arr[], int start, int end, int target){ 11 | while(start <= end){ 12 | int middle = start + (end - start) / 2; 13 | if(arr[middle] == target){ 14 | return middle + 1; 15 | }else if(arr[middle] > target){ 16 | end = middle - 1; 17 | }else if(arr[middle] < target){ 18 | start = middle + 1; 19 | } 20 | } 21 | return -1; 22 | } 23 | 24 | int exponentialSearching(int arr[], int size, int target) { 25 | if(arr[0] == target){ 26 | return 1; 27 | } 28 | int i = 1; 29 | while(i 8 | using namespace std; 9 | 10 | int findKRotation(int arr[], int size){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(star < end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] < arr[size - 1]){ 16 | end = middle; 17 | }else if(arr[middle] >= arr[size - 1]){ 18 | start = middle + 1; 19 | } 20 | } 21 | if(arr[start] < arr[0]){ 22 | return start; 23 | } 24 | return 0; 25 | } 26 | 27 | 28 | int main(){ 29 | int arr[] = {4, 5, 1, 2, 3}; 30 | int n = sizeof(arr) / sizeof(arr[0]); 31 | int result = findKRotation(arr, n); 32 | cout<<"The array is rotated "< 8 | using namespace std; 9 | 10 | int findMinElement(int arr[], int size){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(star < end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] < arr[end]){ 16 | end = middle; 17 | }else if(arr[middle] >= arr[end]){ 18 | start = middle + 1; 19 | } 20 | } 21 | if(arr[start] < arr[0]){ 22 | return arr[start]; 23 | } 24 | return arr[0]; 25 | } 26 | 27 | 28 | int main(){ 29 | int arr[] = {4, 5, 1, 2, 3}; 30 | int n = sizeof(arr) / sizeof(arr[0]); 31 | int result = findMinElement(arr, n); 32 | cout<<"The array is rotated "< 8 | using namespace std; 9 | 10 | int findMinElement(int arr[], int size){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(star < end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] < arr[end]){ 16 | end = middle; 17 | }else if(arr[middle] > arr[end]){ 18 | start = middle + 1; 19 | }else{ 20 | end--; 21 | } 22 | } 23 | if(arr[start] < arr[0]){ 24 | return arr[start]; 25 | } 26 | return arr[0]; 27 | } 28 | 29 | 30 | int main(){ 31 | int arr[] = {4, 5, 5, 1, 1, 2, 2, 3}; 32 | int n = sizeof(arr) / sizeof(arr[0]); 33 | int result = findMinElement(arr, n); 34 | cout<<"The array is rotated "< 8 | using namespace std; 9 | 10 | char nextGreatestLetter(char arr[], int size, char target){ 11 | int start = 0; 12 | int end = size - 1; 13 | if(target > arr[end]){ 14 | return arr[start]; 15 | } 16 | while(start <= end){ 17 | int middle = start + (end - start) / 2; 18 | if(arr[middle] == target){ 19 | start = middle + 1; 20 | }else if(arr[middle] < target){ 21 | start = middle + 1; 22 | }else{ 23 | end = middle - 1; 24 | } 25 | } 26 | if(start == size){ 27 | start = 0; 28 | } 29 | return arr[start]; 30 | } 31 | 32 | 33 | int main(){ 34 | char arr[] = {'c', 'f' ,'j'}; 35 | char c = 'a'; 36 | int n = sizeof(arr) / sizeof(arr[0]); 37 | cout<<"Smallest character larger than target is : "< 8 | using namespace std; 9 | int findInMountainArray(int arr[], int size, int target){ 10 | int start = 0; 11 | int end = size - 1; 12 | while(start <= end){ 13 | int mid = start + (end - start) / 2; 14 | if(arr[mid] < arr[mid + 1]){ 15 | start = mid + 1; 16 | }else{ 17 | end = mid - 1; 18 | } 19 | } 20 | int peak = start; 21 | start = 0; end = peak; 22 | while(start <= end){ 23 | int mid = start + (end - start) / 2; 24 | if(arr[mid] == target){ 25 | return mid; 26 | }else if(arr[mid] < target){ 27 | start = mid + 1; 28 | }else{ 29 | end = mid - 1; 30 | } 31 | } 32 | start = peak + 1, end = size - 1; 33 | while(start <= end){ 34 | int mid = start + (end - start) / 2; 35 | if(arr[mid] == target){ 36 | return mid; 37 | }else if(arr[mid] > target){ 38 | start = mid + 1; 39 | }else{ 40 | end = mid - 1; 41 | } 42 | } 43 | return -1; 44 | } 45 | 46 | int main(){ 47 | int arr[] = {1, 2, 3, 4, 5, 3, 1}; //Sorted 48 | int n = sizeof(arr) / sizeof(arr[0]); 49 | int target = 3; 50 | cout<<"Target found at array Index : "< 8 | using namespace std; 9 | int binarySearching(int arr[], int start, int end, int target) { 10 | while(start <= end){ 11 | int middle = start + (end - start) / 2; 12 | if(arr[middle] == target){ 13 | return middle; 14 | }else if(arr[middle] > target){ 15 | end = middle - 1; 16 | }else if(arr[middle] < target){ 17 | start = middle + 1; 18 | } 19 | } 20 | return -1; 21 | } 22 | 23 | int findPos(int arr[], int target){ 24 | int low = 0; 25 | int high = 1; 26 | int value = arr[0]; 27 | while(value < target){ 28 | low = high; 29 | high = 2 * high; 30 | value = arr[high]; 31 | } 32 | return binarySearching(arr, low, high, target); 33 | } 34 | 35 | 36 | int main(){ 37 | int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; //Sorted and N cannot be taken 38 | int target = 16; 39 | int result = findPos(arr, target); 40 | if(result == -1){ 41 | cout<<"Element is not present in array!"; 42 | }else{ 43 | cout<<"Element is present at index "< 8 | using namespace std; 9 | 10 | search(int arr[], int size, int target, bool findStartIndex){ 11 | int start = 0; 12 | int end = size - 1; 13 | int temp = -1; 14 | int middle; 15 | while(start <= end){ 16 | middle = start + (end - start) / 2; 17 | if(arr[middle] < target){ 18 | start = middle + 1; 19 | }else if(arr[middle] > target){ 20 | end = middle - 1; 21 | }else{ 22 | temp = middle; 23 | if(findStartIndex){ 24 | end = middle - 1; 25 | }else{ 26 | start = middle + 1; 27 | } 28 | } 29 | } 30 | return temp; 31 | } 32 | 33 | vector firstAndLast(int arr[], int size, int target){ 34 | vector v(2, -1); 35 | v[0] = search(arr, size, target, true); 36 | v[1] = search(arr, size, target, false); 37 | return v; 38 | } 39 | 40 | 41 | int main(){ 42 | int arr[] = {1, 2, 3, 4, 4, 4, 7, 8, 9}; 43 | int n = sizeof(arr) / sizeof(arr[0]); 44 | int X = 4; 45 | vector v = firstAndLast(arr, n, X); 46 | cout<<"First occurrence is at Index: "< 8 | using namespace std; 9 | 10 | vector firstAndLast(int arr[], int size, int target){ 11 | vector v; 12 | int start = 0; 13 | int end = size - 1; 14 | int temp = -1; 15 | int middle; 16 | while(start <= end){ 17 | middle = start + (end - start) / 2; 18 | if(arr[middle] == target){ 19 | temp = middle; 20 | end = middle - 1; 21 | }else if(arr[middle] < target){ 22 | start = middle + 1; 23 | }else if(arr[middle] > target){ 24 | end = middle - 1; 25 | } 26 | } 27 | if(temp == -1){ 28 | v.push_back(-1); 29 | return v; 30 | } 31 | v.push_back(temp); 32 | start = 0; 33 | end = size - 1; 34 | temp = -1; 35 | while(start <= end){ 36 | middle = start + (end - start) / 2; 37 | if(arr[middle] == target){ 38 | temp = middle; 39 | start = middle + 1; 40 | }else if(arr[middle] < target){ 41 | start = middle + 1; 42 | }else if(arr[middle] > target){ 43 | end = middle - 1; 44 | } 45 | } 46 | v.push_back(temp); 47 | return v; 48 | } 49 | 50 | 51 | int main(){ 52 | int arr[] = {1, 2, 3, 4, 4, 4, 7, 8, 9}; 53 | int n = sizeof(arr) / sizeof(arr[0]); 54 | int X = 4; 55 | vector v = firstAndLast(arr, n, X); 56 | cout<<"First occurrence is at Index: "< 8 | using namespace std; 9 | 10 | int findFloor(int arr[], int size, int target){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(start <= end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] < target){ 16 | start = middle + 1; 17 | }else if(arr[middle] > target){ 18 | end = middle - 1; 19 | }else{ 20 | return middle; 21 | } 22 | } 23 | return end; 24 | } 25 | 26 | 27 | int main(){ 28 | int arr[] = {1, 2, 8, 10, 11, 12, 19}; 29 | int n = sizeof(arr) / sizeof(arr[0]); 30 | int X = 0; 31 | cout<< findFloor(arr, n, X); 32 | return 0; 33 | } -------------------------------------------------------------------------------- /Searching/Interpolation Searching.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Interpolation Searching 3 | Approach - Mathematical Approach (For uniformly distributed data only!) 4 | Time Complexity : O(log(log N)) 5 | Space Complexity : O(1) 6 | */ 7 | #include 8 | using namespace std; 9 | int interpolationSearching(int arr[], int size, int target){ 10 | int low = 0; 11 | int high = size - 1; 12 | while(low <= high && arr[low] <= target && arr[high] >= target){ 13 | if(low == high){ 14 | if(arr[low] == target){ 15 | return low + 1; 16 | } 17 | return -1; 18 | } 19 | int pos = low + (((target - arr[low])/(arr[high] - arr[low])) * (high - low)); 20 | if(arr[pos] == target){ 21 | return pos+1; 22 | } 23 | if(arr[pos] > target){ 24 | high = pos - 1; 25 | } 26 | if(arr[pos] < target){ 27 | low = pos + 1; 28 | } 29 | return -1; 30 | } 31 | 32 | int main(){ 33 | int arr[] = {1, 2, 3, 4, 5}; //Sorted 34 | int n = sizeof(arr) / sizeof(arr[0]); 35 | int target = 4; 36 | int result = interpolationSearching(arr, n, target); 37 | if(result == -1){ 38 | cout<<"Element is not present in array!"; 39 | }else{ 40 | cout<<"Element is present at index "< 8 | using namespace std; 9 | int jumpSearching(int arr[], int size, int target){ 10 | int start = 0; 11 | int end = sqrt(size); 12 | while(arr[end] < target && end < size){ 13 | start = end; 14 | end += sqrt(size); 15 | 16 | if(end > size - 1){ 17 | end = size; 18 | } 19 | } 20 | for(int i = start; i<=end; i++){ 21 | if(arr[i] == target){ 22 | return i + 1; 23 | } 24 | } 25 | return -1; 26 | } 27 | 28 | int main(){ 29 | int arr[] = {1, 2, 3, 4, 5}; //Sorted 30 | int n = sizeof(arr) / sizeof(arr[0]); 31 | int target = 4; 32 | int result = jumpSearching(arr, n, target); 33 | if(result == -1){ 34 | cout<<"Element is not present in array!"; 35 | }else{ 36 | cout<<"Element is present at index "< 8 | using namespace std; 9 | int linearSearching(int arr[], int size, int target) { 10 | for(int i=0; i 38 | using namespace std; 39 | int linearSearching(int arr[], int size, int target){ 40 | if(size == 0){ 41 | return -1; 42 | }else{ 43 | if(arr[size - 1] == target){ 44 | return size; 45 | }else{ 46 | linearSearching(arr, size - 1, target); 47 | } 48 | } 49 | } 50 | 51 | int main(){ 52 | int arr[] = {1, 2, 4, 3, 5}; 53 | int n = sizeof(arr) / sizeof(arr[0]); 54 | int target = 4; 55 | int result = linearSearching(arr, n, target); 56 | if(result == -1){ 57 | cout<<"Element is not present in array!"; 58 | }else{ 59 | cout<<"Element is present at index "< 8 | using namespace std; 9 | 10 | int PeakElement(int arr[], int size){ 11 | /* When only single element is present */ 12 | if(size == 1){ 13 | return 0; 14 | } 15 | /* When only increasing element is present */ 16 | if(arr[0] > arr[1]){ 17 | return 0; 18 | } 19 | /* When only decreasing element is present */ 20 | if(arr[size - 1] > arr[size - 2]){ 21 | return size - 1; 22 | } 23 | int low = 0; 24 | int high = size - 1; 25 | while(low <= high){ 26 | int mid = low + (high - low) / 2; 27 | if(arr[mid] < arr[mid + 1]){ 28 | low = mid + 1; 29 | }else{ 30 | high = mid - 1; 31 | } 32 | } 33 | return low; 34 | } 35 | 36 | 37 | int main(){ 38 | int arr[] = {1, 2, 8, 10, 6, 3, 0}; 39 | int n = sizeof(arr) / sizeof(arr[0]); 40 | cout<<"Peak of mountain is at Index : "< 8 | using namespace std; 9 | 10 | bool searchRotatedArray(int arr[], int size, int target){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(start <= end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] == target){ 16 | return true; 17 | } 18 | if(arr[middle] < arr[end]){ 19 | if(target > arr[middle] && target <= arr[end]){ 20 | start = middle + 1; 21 | }else{ 22 | end = middle - 1; 23 | } 24 | }else if(arr[middle] > arr[end]){ 25 | if(target < arr[middle] && target >= arr[start]){ 26 | end = middle - 1; 27 | }else{ 28 | start = middle + 1; 29 | } 30 | }else{ 31 | end--; 32 | } 33 | } 34 | return false; 35 | } 36 | 37 | 38 | int main(){ 39 | int arr[] = {5, 6, 7, 8, 8, 9, 10, 1, 1, 2, 3, 4}; 40 | int target = 8; 41 | int n = sizeof(arr) / sizeof(arr[0]); 42 | bool result = searchRotatedArray(arr, n, target); 43 | if(!result){ 44 | cout<<"Element is not present in array :("; 45 | }else{ 46 | cout<<"Element is present in array :)"; 47 | } 48 | return 0; 49 | } -------------------------------------------------------------------------------- /Searching/Search in a Rotated Array with Distinct Elements.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | Search in a Rotated Array with Distinct Elements 3 | Approach - Binary search (Non-Decreasing Sorted) 4 | Time Complexity : O(logN) 5 | Space Complexity : O(1) 6 | */ 7 | #include 8 | using namespace std; 9 | 10 | int searchRotatedArray(int arr[], int size, int target){ 11 | int start = 0; 12 | int end = size - 1; 13 | while(start <= end){ 14 | int middle = start + (end - start) / 2; 15 | if(arr[middle] == target){ 16 | return middle; 17 | } 18 | if(arr[middle] < arr[end]){ 19 | if(target > arr[middle] && target <= arr[end]){ 20 | start = middle + 1; 21 | }else{ 22 | end = middle - 1; 23 | } 24 | }else{ 25 | if(target < arr[middle] && target >= arr[start]){ 26 | end = middle - 1; 27 | }else{ 28 | start = middle + 1; 29 | } 30 | } 31 | } 32 | return -1; 33 | } 34 | 35 | 36 | int main(){ 37 | int arr[] = {5, 6, 7, 8, 9, 10, 1, 2, 3}; 38 | int target = 10; 39 | int n = sizeof(arr) / sizeof(arr[0]); 40 | int result = searchRotatedArray(arr, n, target); 41 | if(result == -1){ 42 | cout<<"Element is not present in array!"; 43 | }else{ 44 | cout<<"Element is present at index : "< 8 | using namespace std; 9 | 10 | void bubbleSorting(int arr[], int size){ 11 | for(int i=0; i arr[j + 1]){ 15 | swap(arr[j], arr[j + 1]); 16 | temp = true; 17 | } 18 | } 19 | if(temp == false){ 20 | break; 21 | } 22 | } 23 | 24 | for(int i=0; i 7 | using namespace std; 8 | 9 | void bubbleSorting(int arr[], int size){ 10 | for(int i=0; i arr[j + 1]){ 13 | int temp = arr[j]; 14 | arr[j] = arr[j + 1]; 15 | arr[j + 1] = temp; 16 | } 17 | } 18 | } 19 | 20 | for(int i=0; i 7 | using namespace std; 8 | 9 | void countSorting(int arr[], int size){ 10 | int largest = INT_MIN; 11 | for(int i=0; i v(largest + 1, 0); 15 | for(int i=0; i 29 | using namespace std; 30 | 31 | int main(){ 32 | int t; 33 | cin>>t; 34 | while(t--){ 35 | int w, h, n; 36 | cin>>w>>h>>n; 37 | vector xCord, yCord; 38 | // 1 Extra tower in origin. 39 | xCord.push_back(0); // xCord = [0] 40 | yCord.push_back(0); // yCord = [0] 41 | while(n--){ 42 | int x, y; 43 | cin>>x>>y; 44 | xCord.push_back(x); // xCord = [0, 3, 11, 8] 45 | yCord.push_back(y); // yCord = [0, 8, 2, 6] 46 | } 47 | // 1 Extra tower at end. 48 | xCord.push_back(w + 1); // xCord = [0, 3, 11, 8, 16] 49 | yCord.push_back(h + 1); // yCord = [0, 8, 2, 6, 9] 50 | 51 | sort(xCord.begin(), xCord.end()); // xCord = [0, 3, 8, 11, 16] 52 | sort(yCord.begin(), yCord.end()); // yCord = [0, 2, 6, 8, 9] 53 | 54 | int maxXCord = 0, maxYCord = 0; 55 | 56 | for(int i=0; i 7 | using namespace std; 8 | 9 | void bubbleSorting(int arr[], int size){ 10 | for(int i=1; i= 0 && arr[previous] > temp){ 14 | arr[previous + 1] = arr[previous]; 15 | previous--; 16 | } 17 | arr[previous + 1] = temp; 18 | } 19 | 20 | for(int i=0; i 7 | using namespace std; 8 | 9 | void selectionSort(int arr[], int size){ 10 | for(int i=0; i 7 | using namespace std; 8 | 9 | bool cmp(int a, int b){ 10 | return a > b; 11 | } 12 | 13 | int main(){ 14 | int arr[] = {1, 4, 6, 8, 3, 5, 9, 2, 7}; 15 | int n = sizeof(arr) / sizeof(arr[0]); 16 | 17 | sort(arr, arr + n); 18 | cout<<"Elements shorted in ascending order : "; 19 | for(int i= 0; i()); 26 | cout<<"Elements shorted in descending order : "; 27 | for(int i=0; i 8 | using namespace std; 9 | vector complement(string s, int size){ 10 | int l=0; 11 | int ans_l,ans_r; 12 | int maxDiff=0; 13 | int zeroCount = 0, oneCount = 0; 14 | for(int i=0; i maxDiff){ 25 | ans_l = l; 26 | ans_r = i; 27 | maxDiff = zeroCount - oneCount; 28 | } 29 | } 30 | } 31 | if(maxDiff == 0) return {-1}; 32 | return {ans_l + 1, ans_r + 1}; 33 | } 34 | 35 | int main(){ 36 | string s = "0110010"; 37 | int n = sizeof(arr) / sizeof(arr[0]); 38 | auto ans = complement(s, n); 39 | if(ans.size() == 1){ 40 | cout< 8 | using namespace std; 9 | int countAnagrams(string s, string p){ 10 | vector sHash(26, 0), pHash(26, 0); 11 | int count = 0; 12 | int s_len = s.size(); 13 | int p_len = p.size(); 14 | 15 | for(int i=0; i 8 | using namespace std; 9 | int isPalindrom(string S){ 10 | string s(S); 11 | reverse(s.begin(), s.end()); 12 | if(s == S){ 13 | return 1; 14 | } 15 | return 0; 16 | } 17 | 18 | int main(){ 19 | string s = "abba"; 20 | int result = isPalindrom(s); 21 | if(result){ 22 | cout<<"Palindrome"< 2 | using namespace std; 3 | 4 | int main(){ 5 | 6 | char sentence[10000]; 7 | char temp = cin.get(); 8 | int length = 1; 9 | while(temp != '\n'){ 10 | sentence[length] = temp; 11 | temp = cin.get(); 12 | } 13 | sentence[length] = '\0'; 14 | cout<