[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n"
  },
  {
    "path": "04_Conditional_Statements/conditionals.cpp",
    "content": "#include <iostream>\n#include <cmath>\nusing namespace std;\n\nint main() {\n    //Print the largest of 2 numbers\n    int a = 3, b = 5;\n    if(a >= b) {\n        cout << \"a is larger\" << endl;\n    } else {\n        cout << \"b is larger\" << endl;\n    }\n\n    //Print if a number is Odd or Even\n    int num = 5;\n    if(num % 2 == 0) {\n        cout << \"Number is Even\" << endl;\n    } else {\n        cout << \"Number is Odd\" << endl;\n    }\n\n    //Income Tax Calculator\n    int income = 7; //in Lakhs\n    float tax;\n\n    if(income < 5) {\n        tax = 0;\n    } else if(income <= 10) {\n        tax = 0.2 * income;\n    } else {\n        tax = 0.3 * income;\n    }\n\n    cout << \"Tax = \" << (tax * 100000) << endl;\n\n    //Print Largest of 3 Numbers\n    int x = 2, y = 3, z = 5;\n    if(x >= y && x >= z) {\n        cout << \"x is largest\" << endl;\n    }   else if(y >= z) {\n        cout << \"y is largest\" << endl;\n    } else {\n        cout << \"z is largest\" << endl;\n    }\n\n    //Odd or Even using Ternary Operator\n    int num = 25;\n    bool isEven = num % 2 == 0 ? true : false;\n    \n    //Calculator using Switch Statement\n    int op = '*';\n    int num1 = 4;\n    int num2 = 5;\n\n    switch(op) {\n        case '+' : cout << \"a + b = \" << (num1 + num2) << endl;\n                    break;\n        case '-' : cout << \"a - b = \" << (num1 - num2) << endl;\n                    break;\n        case '*' : cout << \"a * b = \" << (num1 * num2) << endl;\n                    break;\n        case '/' : cout << \"a / b = \" << (num1 / num2) << endl;\n                    break;\n        default : cout << \"Invalid Operator\" << endl;\n    }\n    return 0;\n}"
  },
  {
    "path": "05_Loops/homework.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nint main() {\n    //Qs : Factorial of a number n\n    int n = 6;\n    int fact = 1;\n    for(int i=1; i<=n; i++) {\n        fact *= i;\n    }\n\n    cout << \"factorial of \" << n << \" = \" << fact << \"\\n\";\n    \n    //Qs : Multiplication Table of n\n    n = 8;\n    for(int i=1; i<=10; i++) {\n        cout << (n * i) << \" \";\n    }\n    cout << endl;\n\n    //Qs : Check for Armstrong Number\n    n = 371;\n    int num = n;\n    int cubeSum = 0;\n\n    while(num > 0) {\n        int lastDig = num % 10;\n        cubeSum += lastDig * lastDig * lastDig;\n        num /= 10;\n    }\n\n    if(n == cubeSum) {\n        cout << \"Armstrong number\\n\";\n    } else {\n        cout << \"NOT an Armstrong number\\n\";\n    }\n\n    //Qs : Print Primes from 2 to N\n    int N = 15;\n    for(int i=2; i<=N; i++) {\n        int curr = i; //current number to check for\n        bool isPrime = true;\n        for(int j=2; j*j<=i; j++) {\n            if(curr % j == 0) {\n                isPrime = false;\n            }\n        }\n\n        if(isPrime) {\n            cout << curr << \" \";\n        }\n    }\n    cout << endl;\n\n    //Qs : Print N Fibonacci Numbers\n    n = 10;\n    int first = 0, sec = 1;\n    cout << first << \" \" << sec << \" \";\n\n    for(int i=2; i<n; i++) {\n        int third = first + sec;\n        cout << third << \" \";\n        first = sec;\n        sec = third;\n    }\n\n    cout << \"\\n\";\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "05_Loops/loops.cpp",
    "content": "#include <iostream>\n#include <cmath>\nusing namespace std;\n\nint main() {\n    int n = 10;\n    //Print numbers from 1 to n\n    // for(int i=1; i<=n; i++) {\n    //     cout << i << \" \";\n    // }\n    // cout << endl;\n\n    //Print numbers from n to 1 (reverse order)\n    // for(int i=n; i>0; i--) {\n    //     cout << i << \" \";\n    // }\n    // cout << endl;\n\n    //Print Sum of first N natural numbers\n    // int sum = 0;\n    // for(int i=1; i<=n; i++) {\n    //     sum += i;\n    // }\n\n    // cout << \"Sum from 1 to n = \" << sum << endl;\n\n    //Square Pattern using For Loop\n    // for(int i=1; i<=4; i++) {\n    //     cout << \"****\" << endl;\n    // }\n\n    //Sum of Digits of a Number\n    // int digitSum = 0;\n    // int num = 12345;\n\n    // while(num > 0) {\n    //     digitSum += num % 10;\n    //     num /= 10;\n    // }\n\n    // cout << \"sum of digits = \" << digitSum << endl;\n\n    //Sum of Odd Digits of a Number\n    // int oddDigSum = 0;\n    // int num = 12345;\n    // while(num > 0) {\n    //     int lastDig = num % 10;\n    //     if(lastDig % 2 != 0) {\n    //         oddDigSum += lastDig;\n    //     }\n    //     num /= 10;\n    // }\n\n    // cout << \"sum of odd digits = \" << oddDigSum << endl;\n\n    //Print a number's Digits in Reverse\n    // int num = 12345;\n    //\n    // while(num > 0) {\n    //     cout << num % 10 << \" \";\n    //     num /= 10;\n    // }\n    // cout << endl;\n\n    //Reverse the given number & print the result\n    // int num = 12345;\n    // int res = 0;\n\n    // while(num > 0) {\n    //     int lastDig = num % 10;\n    //     res = res * 10 + lastDig;\n    //     num /= 10;\n    // }\n    // cout << res << endl;\n\n    //Check if a number is Prime or not\n    int num = 49;\n    bool isPrime = true;\n\n    //Solution 1\n    for(int i=2; i<num-1; i++) {\n        if(num % i == 0) {\n            isPrime = false;\n            break;\n        }\n    }\n    cout << isPrime << endl;\n\n    //Solution 2 (slightly better) : #include <cmath>\n    isPrime = true;\n    for(int i=2; i<=sqrt(num); i++) {\n        if(num % i == 0) {\n            isPrime = false;\n            break;\n        }\n    }\n    cout << isPrime << endl;\n    return 0;\n}"
  },
  {
    "path": "06_Patterns/patterns.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nint main() {\n    int n = 4;\n\n    //Number Square Pattern\n    for(int i=1; i<=n; i++) {\n        for(int j=1; j<=n; j++) {\n            cout << i;\n        }\n        cout << endl;\n    }\n\n   // Star Pattern\n    for(int i=1; i<=n; i++) {\n        for(int j=1; j<=i; j++) {\n            cout << \"*\";\n        }\n        cout << endl;\n    }\n\n    //Inverted Star Pattern\n    for(int i=1; i<=n; i++) {\n        for(int j=1; j<=n-i+1; j++) {\n            cout << \"*\";\n        }\n        cout << endl;\n    }\n\n   // Half Pyramid Pattern\n    for(int i=1; i<=n; i++) {\n        for(int j=1; j<=i; j++) {\n            cout << j;\n        }\n        cout << endl;\n    }\n\n   // Character Pyramid Pattern\n    char ch = 'A';\n    for(int i=1; i<=n; i++) {\n        for(int j=1; j<=i; j++) {\n            cout << ch++;\n        }\n        cout << endl;\n    }\n\n    //Hollow Rectangle Pattern\n    for(int i=1; i<=n; i++) {\n        cout << \"*\";\n        for(int j=1; j<=n-1; j++) {\n            if(i == 1 || i == n) {\n                cout << \"*\";\n            } else {\n                cout << \" \";\n            }\n        }\n        cout<< \"*\" << endl;\n    }\n\n    //Inverted & Rotated Half Pyramid\n    for(int i=1; i<=n; i++) {\n        //spaces\n        for(int j=1; j<=n-i; j++) {\n            cout << \" \";\n        }\n        //stars\n        for(int j=1; j<=i; j++) {\n            cout << \"*\";\n        }\n        cout << endl;\n    }\n\n    //Floyd's Triange Pattern\n    int num = 1;\n    for(int i=1; i<=5; i++) {\n        for(int j=1; j<=i; j++) {\n            cout << num++ << \" \";\n        }\n        cout << endl;\n    }\n\n    //Diamond Pattern\n    for(int i=1; i<=n; i++) {\n        for(int j=1; j<=n-i; j++) {\n            cout << \" \";\n        }\n        for(int j=1; j<=2*i-1; j++) {\n            cout << \"*\";\n        }\n        cout << endl;\n    }\n\n    for(int i=n; i>0; i--) {\n        for(int j=1; j<=n-i; j++) {\n            cout << \" \";\n        }\n\n        for(int j=1; j<=2*i-1; j++) {\n            cout << \"*\";\n        }\n        cout << endl;\n    }\n\n    //Butterfly Pattern\n    for(int i=1; i<=n; i++) {\n        for(int j=1; j<=i; j++) {\n            cout << \"*\";\n        }\n        for(int j=1; j<=2*(n-i); j++) {\n            cout << \" \";\n        }\n        for(int j=1; j<=i; j++) {\n            cout << \"*\";\n        }\n        cout << endl;\n    }\n    \n    for(int i=n; i>0; i--) {\n        for(int j=1; j<=i; j++) {\n            cout << \"*\";\n        }\n        for(int j=1; j<=2*(n-i); j++) {\n            cout << \" \";\n        }\n        for(int j=1; j<=i; j++) {\n            cout << \"*\";\n        }\n        cout << endl;\n    }\n\n    \n    return 0;\n}"
  },
  {
    "path": "07_Functions/functions.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\n//Simple Function\nvoid sayHello() {\n    cout << \"Hello from Apna College\\n\";\n}\n\n//Sum of 2 numbers\nint sum(int a, int b) {\n    return a + b;\n}\n\n//Sum of 2 float - Function Overloading\nfloat sum(float x, float y) {\n    return x + y;\n}\n\n//Product of 2 numbers\nint prod(int a, int b) {\n    return a + b;\n}\n\n//Is Number Odd or Even\nvoid evenOrOdd(int n) {\n    if(n % 2 == 0) {\n        cout << \"Even\\n\";\n    } else {\n        cout << \"Odd\\n\";\n    }\n}\n\n//Factorial of n\nint factorial(int n) {\n    int fact = 1;\n    for(int i=2; i<=n; i++) {\n        fact = fact * i;\n    }\n\n    return fact;\n}\n\n//Prime or Not\nbool isPrime(int n) {\n    if(n == 0 || n == 1) {\n        return false;\n    }\n\n    for (int i = 2; i*i <= n; i++) {\n        if(n % i == 0) {\n            return false;\n        }\n    }\n    \n    return true;\n}\n\n//Binomial Coefficient nCr\nint binCoeff(int n, int r) {\n    return factorial(n) / (factorial(n-r) * factorial(r));\n}\n\n//All primes in range [2, n]\nvoid allPrimes(int n) {\n    for(int i=2; i<=n; i++) {\n        if(isPrime(i)) {\n            cout << i << \" \";\n        }\n    }\n\n    cout << endl;\n}\n\nint main() {\n    sayHello();\n    cout << sum(1, 2) << endl;\n    cout << sum(1.0f, 2.0f) << endl;\n    cout << prod(1, 2) << endl;\n    evenOrOdd(25);\n    cout << factorial(5) << endl;\n    cout << isPrime(5) << endl;\n    cout << binCoeff(4, 2) << endl;\n    allPrimes(15);\n\n    return 0;\n}\n\n"
  },
  {
    "path": "08_Binary_Numbers/binary.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\n//Convert Binary to Decimal\nvoid binToDecimal(int n) {\n    int res = 0;\n    int p = 1;\n    while(n > 0) {\n        int lastDig = n % 10;\n        res += lastDig * p;\n        p = p * 2;\n        n = n / 10;\n    }\n    cout << \"Decimal form = \" << res << \"\\n\";\n}\n\n//Convert Decimal to Binary\nvoid decToBinary(int n) {\n    int res = 0;\n    int p = 1;\n    while(n > 0) {\n        int rem = n % 2;\n        res += rem * p;\n        p = p * 10;\n        n = n / 2;\n    }\n    cout << \"Binary form = \" << res << \"\\n\";\n}\n\nint main() {\n    binToDecimal(101);\n    decToBinary(5);\n    return 0;\n}\n\n"
  },
  {
    "path": "09_Pointers/pointers.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nvoid passValue(int param) {\n    param = 1000;\n}\n\n//using Pointers\nvoid passReference(int *param) {\n    *param = 1000;\n}\n\n//using Reference Variable\nvoid passReference2(int &param) {\n    param = 5000;\n}\n\nint main() {\n    int a = 10;\n    int *ptr = &a;\n    int **ptr2 = &ptr;\n\n    cout << &a << \" = \" << ptr << endl;\n    cout << &ptr << \" = \" << ptr2 << endl;\n\n    //Dereference Operator\n    cout << a << \" = \" << *ptr << \" = \" << *(&a) << endl;\n\n    *ptr = 20;\n    cout << a << endl; //should be 20 now\n\n    //Null Pointer\n    float* nptr = NULL;\n    cout << nptr << endl;\n\n    //cout << *nptr; // Gives Segmentation Fault\n\n    //Pass by value\n    int x = 0;\n    passValue(x);\n    cout << x << endl;\n\n    //Pass by reference\n    passReference(&x);\n    cout << x << endl;\n\n    //Reference Variable\n    int i = 5;\n    int &j = i;\n    j++;\n    cout << i << endl;\n\n    passReference2(x);\n    cout << x << endl;\n}\n\n\n"
  },
  {
    "path": "10_Array_1/arrays.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nvoid printArr(int *arr, int n) {\n    for(int i=0; i<n; i++) {\n        cout << arr[i] << \",\";\n    }\n    cout << endl;\n}\n\nint linearSearch(int *arr, int n, int key) {\n    for(int i=0; i<n; i++) {\n        if(arr[i] == key) {\n            return i;\n        }\n    }\n\n    return -1;\n}\n\nvoid findLargest(int *arr, int n) {\n    int max;\n    for(int i=0; i<n; i++) {\n        if(arr[i] > max) {\n            max = arr[i];\n        }\n    }\n\n    cout << \"max = \" << max << endl;\n}\n\n//copy & paste method\nvoid reverseArr1(int *arr, int n) {\n    int newArr[n];\n    for(int i=0; i<n; i++) {\n        newArr[i] = arr[n-i-1];\n    }\n\n    for(int i=0; i<n; i++) {\n        arr[i] = newArr[i];\n    }\n\n    printArr(arr, n);\n}\n\n//2 pointer method\nvoid reverseArr2(int *arr, int n) {\n    int start = 0, end = n-1;\n    \n    while(start < end) {\n        swap(arr[start], arr[end]);\n        start++;\n        end--;\n    }\n\n    printArr(arr, n);\n}\n\n//Binary Search\nint binSearch(int *arr, int n, int key) {\n    int start = 0, end = n-1;\n\n    while(start <= end) {\n        int mid = (start + end) / 2;\n\n        if(key == arr[mid]) {\n            return mid;\n        } else if(key > arr[mid]) {\n            //search in 2nd half\n            start = mid + 1;\n        } else {\n            //search in 1st half\n            end = mid - 1;\n        }\n    }\n\n    return -1;\n}\n\n//Print all Subarrays of an Array\nvoid printSubarrays(int *arr, int n) {\n    for(int start=0; start<n; start++) {\n        for(int end=start; end<n; end++) {\n\n            for(int i=start; i<=end; i++) {\n                cout << arr[i] << \",\";\n            }\n            cout << endl;\n        }\n    }\n}\n\n\nint main() {\n    //Creating an array\n    int marks[5];\n    cout << marks[0] << \", \" << marks[4] << endl;\n\n    int ages[50] = {24, 48, 64};\n    cout << ages[0] << \",\" << ages[49]<< endl;\n\n    float heights[] = {5.5, 4.9, 6.2};\n    cout << heights[0] << endl;\n\n    //Size of array\n    int a[5];\n    int n = sizeof(a) / sizeof(int);\n    cout << \"size = \" << n << endl;\n\n    //Input & Output Array\n    int n;\n    cin >> n;\n    int arr[n];\n    for(int i=0; i<n; i++) {\n        cin >> arr[i];\n    }\n\n    for(int i=0; i<n; i++) {\n        cout << arr[i] << \",\";\n    }\n    cout << \"\\n\";\n\n    int arr[] = {1, 2, 3, 4, 5};\n    printArr(arr, 5);\n\n    cout << linearSearch(arr, 5, 3) << endl;\n\n    reverseArr1(arr, 5);\n    reverseArr2(arr, 5);\n\n    cout << binSearch(arr, 5, 3) << endl;\n\n    printSubarrays(arr, 5);\n    return 0;\n}\n\n\n"
  },
  {
    "path": "11_Arrays_2/arrays2.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\n//max sum subarray (brute force - O(N^3))\nint maxSumSubarray(int *arr, int n) {\n    int maxSum = INT_MIN; \n    for(int start=0; start<n; start++) {\n        for(int end=start; end<n; end++) {\n            int sum = 0;\n            for(int i=start; i<=end; i++) {\n                sum += arr[i];\n            }\n            maxSum = max(sum, maxSum);\n        }\n    }\n\n    cout << maxSum << \"\\n\";\n    return maxSum;\n}\n\n//max sum subarray - O(N^2)\nint maxSumSubarray2(int *arr, int n) {\n    int maxSum = INT_MIN; \n    for(int start=0; start<n; start++) {\n        int sum = 0;\n        for(int i=start; i<n; i++) {\n            sum += arr[i];\n            maxSum = max(sum, maxSum);\n        }\n    }\n\n    cout << maxSum << \"\\n\";\n    return maxSum;\n}\n\n//max sum subarray - Kadane's - O(N)\nint maxSumSubarray3(int *arr, int n) {\n    int currSum = 0;\n    int maxSum = INT_MIN; \n    \n    for(int i=0; i<n; i++) {\n        currSum += arr[i];\n        maxSum = max(currSum, maxSum);\n        \n        if(currSum < 0) {\n            currSum = 0;\n        }\n    }\n\n    cout << maxSum << \"\\n\";\n    return maxSum;\n}\n\n//Trapping Rainwater\nint trap(int *heights, int n) {\n    int maxLeft[100000] = {0};\n    int maxRight[100000] = {0};\n\n    int maxTillNow = heights[0];\n    for(int i=1; i<n; i++) {\n        maxLeft[i] = max(maxTillNow, heights[i-1]);\n        maxTillNow = max(maxTillNow, heights[i]);\n    }\n\n    maxRight[n-1] = 0;\n    maxTillNow = heights[n-1];\n    for(int i=n-2; i>=0; i--) {\n        maxRight[i] = max(maxTillNow, heights[i+1]);\n        maxTillNow = max(maxTillNow, heights[i]);\n    }\n\n    int water = 0;\n    for(int i=0; i<n; i++) {\n        int ht = min(maxLeft[i], maxRight[i]) - heights[i];\n        if(ht > 0) {\n            water += ht;\n        }\n    }\n\n    cout << \"water trapped = \" << water << \"\\n\";\n    return water;\n}\n\n//Buy & Sell Stocks\nint maxProfit(int *prices, int n) {\n    int bestBuy[100000] = {0};\n    bestBuy[0] = INT_MAX;\n\n    for(int i=1; i<n; i++) {\n        bestBuy[i] = min(bestBuy[i-1], prices[i-1]);\n    }\n\n    int maxProfit = 0;\n    for(int i=1; i<n; i++) {\n        int currProfit = prices[i] - bestBuy[i];\n        maxProfit = max(maxProfit, currProfit);\n    }\n\n    cout << \"max profit = \" << maxProfit << \"\\n\";\n    return maxProfit;\n}\n\nint main() {\n    int arr[] = {2, -3, 6, -5, 4, 2};\n    int n = sizeof(arr) / sizeof(int);\n\n    maxSumSubarray(arr, n);\n    maxSumSubarray2(arr, n);\n    maxSumSubarray3(arr, n);\n\n    int arr2[] = {-1, -2, -3};\n    maxSumSubarray3(arr2, 3);\n\n    int heights[] = {4, 2, 0, 6, 3, 2, 5};\n    trap(heights, 7);\n\n    int prices[] = {7,1,5,3,6,4};\n    maxProfit(prices, 6);\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "12_Basic_Sorting_Algos/sorting.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\n//Print Array\nvoid printArr(int arr[], int n) {\n    for(int i=0; i<n; i++) {\n        cout << arr[i] << \" \";\n    }\n    cout << endl;\n}\n\nvoid printArr(char arr[], int n) {\n    for(int i=0; i<n; i++) {\n        cout << arr[i] << \" \";\n    }\n    cout << endl;\n}\n\nvoid bubbleSort(int arr[], int n) {\n    for(int i=0; i<n-1; i++) {\n        for(int j=0; j<n-i-1; j++) {\n            if(arr[j] > arr[j+1]) {\n                swap(arr[j], arr[j+1]);\n            }\n        }\n    }\n\n    printArr(arr, n);\n}\n\nvoid selectionSort(int arr[], int n) {\n    for(int i=0; i<n-1; i++) {\n        int minIdx = i;\n        for(int j=i+1; j<n; j++) {\n            if(arr[j] < arr[minIdx]) {\n                minIdx = j;\n            }\n        }\n\n        swap(arr[i], arr[minIdx]);\n    }\n\n    printArr(arr, n);\n}\n\nvoid insertionSort(int arr[], int n) {\n    for(int i=1; i<n; i++) {\n        int curr = arr[i];\n        int prev = i-1;\n        //sorted part loop - backwards\n        while(prev >= 0 && arr[prev] > curr) {\n            arr[prev+1] = arr[prev];\n            prev--;\n        }\n\n        //swap\n        swap(arr[prev+1], curr);\n    }\n    \n     printArr(arr, n);\n}\n\nvoid countSort(int arr[], int n) {\n    int range = INT_MIN;\n    for(int i=0; i<n; i++) {\n        range = max(range, arr[i]);\n    }\n\n    int freqArr[100001];\n    for(int i=0; i<n; i++) {\n        freqArr[arr[i]]++;\n    }\n\n    for(int i=0; i<range; i++) {\n        while(freqArr[i] > 0) {\n            arr[i] = i;\n            freqArr[i]--;\n        }\n    }\n\n    printArr(arr, n);\n}\n\n\n\nvoid sortChars(char arr[], int n) {\n    for(int i=1; i<n; i++) {\n        char curr = arr[i];\n        int prev = i-1;\n        \n        while(prev >= 0 && arr[prev] < curr) {\n            arr[prev+1] = arr[prev];\n            prev--;\n        }\n\n        swap(arr[prev+1], curr);\n    }\n    \n     printArr(arr, n);\n}\n\nint main() {\n    int arr[5] = {5, 4, 1, 3, 2};\n    //bubbleSort(arr, 5);\n    //selectionSort(arr, 5);\n    //insertionSort(arr, 5);\n\n    int arr2[8] = {1, 4, 1, 3, 2, 4, 3, 7};\n    //countSort(arr2, 8);\n\n    sort(arr2, arr2+8);\n    printArr(arr2, 8);\n\n    char ch[] = { 'f', 'b', 'a', 'e', 'c', 'd'};\n    sortChars(ch, 6);\n    \n    return 0;    \n}\n\n\n"
  },
  {
    "path": "13_2DArray/2DArrays.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nvoid printSpiral(int matrix[][4], int n, int m) {\n    int scol = 0, srow = 0;\n    int ecol = m-1, erow = n-1;\n\n    while(srow <= erow && scol <= ecol) {\n        //top\n        for(int j=scol; j<=ecol; j++) {\n            cout << matrix[srow][j] << \" \";\n        }\n\n        //right\n        for(int i=srow+1; i<=erow; i++) {\n            cout << matrix[i][ecol] << \" \";\n        }\n\n        //bottom\n        for(int j=ecol-1; j>=scol; j--) {\n            if(srow == erow) {\n                break;\n            }\n            cout << matrix[erow][j] << \" \";\n        }\n\n        //left\n        for(int i=erow-1; i>=srow+1; i--) {\n            if(scol == ecol) {\n                break;\n            }\n            cout << matrix[i][scol] << \" \";\n        }\n\n        srow++; scol++;\n        erow--; ecol--;\n    }\n\n    cout << endl;\n}\n\nvoid diagonalSum(int mat[][4], int n) { \n    int sum = 0;\n\n    //O(n^2)\n    for(int i=0; i<n; i++) {\n        for(int j=0; j<n; j++) {\n            if(i == j) {\n                sum += mat[i][j];\n            } else if (i+j == n-1) {\n                sum += mat[i][j];\n            }\n        }\n    }\n    cout <<\"O(N^2) code => sum = \" << sum << endl;\n\n    //O(n)\n    sum = 0;\n    for(int i=0; i<n; i++) {\n        sum += mat[i][i];\n        if(n-1-i != i)\n            sum+= mat[i][n-1-i];\n    }\n    cout <<\"O(N) code => sum = \" << sum << endl;\n}\n\nbool search(int mat[][4], int n, int m, int key) {\n    int i=0, j=m-1;\n    while(i < n && j >= 0) {\n        if(mat[i][j] == key) {\n            cout << \"found at (\" << i << \",\" << j << \")\\n\";\n            return true;\n        } else if(mat[i][j] > key) {\n            //go left\n            j--;\n        } else {\n            //go right\n            i++;\n        }\n    }\n\n    cout << \"key NOT found\\n\";\n    return false;\n}\n\nvoid func(int (*ptr)[4]) {\n    cout << ptr << endl;\n    cout << ptr+1 << endl;\n\n    //address(pointer) of row\n    cout << \"0th row address\" << ptr << endl;\n    cout << \"1st row address\" << (ptr+1) << endl;\n\n    //actual row\n    cout << \"0th row start\" << *ptr << endl;\n    cout << \"1st row start\" << *(ptr+1) << endl;\n\n    //to get j=2 column in i=0 row\n    cout << \"(0, 2) = \" << *(*ptr+2) << endl;\n\n    //to get j=2 column in i=1 row\n    cout << \"(1, 2) = \" << *(*(ptr+1)+2) << endl;\n\n}\n\nint main() {\n    int matrix[4][4] = {{1, 2, 3, 4}, \n                         {5, 6, 7, 8},\n                         {9, 10, 11, 12},\n                         {13, 14, 15, 16}};\n\n    int matrix2[3][4] = {{1, 2, 3, 4}, \n                         {5, 6, 7, 8},\n                         {9, 10, 11, 12}};\n\n    printSpiral(matrix, 4, 4);\n    //Expected : 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10\n\n    printSpiral(matrix2, 3, 4);\n\n    diagonalSum(matrix, 4);\n\n    int mat[4][4] = {{10, 20, 30, 40}, \n                     {15, 25, 35, 45},\n                     {27, 29, 37, 48},\n                     {32, 33, 39, 50}};\n\n    search(mat, 4, 4, 33);\n    search(mat, 4, 4, 100);\n\n    //Pointers & 2D Arrays\n    func(matrix);\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "14_String/strings.cpp",
    "content": "#include <iostream>\n#include <cstring>\n#include <string>\nusing namespace std;\n\n//Convert to UpperCase\nvoid toUpper(char str[], int n) {\n    for(int i=0; i<n; i++) {\n        if(str[i] >= 'A' && str[i] <= 'Z') {\n            continue;\n        } else {\n            int diff =  str[i] - 'a';\n            str[i] = 'A' + diff;\n        }\n    }\n}\n\n//Reverse of a char Array\nvoid reverse(char str[], int n) {\n    int st = 0, end = n-1;\n\n    while(st < end) {\n        swap(str[st++], str[end--]);\n    }\n}\n\n//Valid Palindrome\nbool isValid(char str[], int n) {\n    int st = 0, end = n-1;\n\n    while(st < end) {\n        if(str[st++] != str[end--]) {\n            cout << \"not valid\";\n            return false;\n        }\n    }\n    cout << \"valid\";\n    return true;\n}\n\n//Valid Anagram\nbool isAnagram(string s, string t) {\n        if(s.length() != t.length()) {\n            return false;\n        }\n\n        int count[26] = {0};\n        for(int i=0; i<s.length(); i++) {\n            count[s[i]-'a']++;\n        }\n\n        for(int i=0; i<t.length(); i++) {\n            int idx = t[i] - 'a';\n            if(count[idx] == 0) {\n                return false;\n            }\n            count[idx]--;\n        }\n\n        return true;\n}\n\nint main() {\n    //C++ char arrays\n    /*char word[20];\n    cin.getline(word, 20);\n    cout << \"your word is : \" << word << endl;*/\n    \n    //<cstring> functions\n    /*strcpy(word, \"c++\");\n    cout << \"now your word is : \" << word << endl;\n\n    strcat(word, \" is my favorite\");\n    cout << word << endl;\n\n    cout << strcmp(\"hello\", \"hello\") << endl;\n    cout << strcmp(\"abc\", \"xyz\") << endl;*/\n\n    //C++ Strings\n    string str;\n    getline(cin, str);\n    cout << str << endl;\n\n    //String Member Functions\n    cout << str.length() << endl;\n    cout << str.at(0) << endl;\n    cout << str.substr(2, 3) << endl;\n    cout << str.find(\"college\") << endl;\n    cout << str.find(\"xyz\") << endl;\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "15_Vector/vectors.cpp",
    "content": "#include <iostream>\n#include <vector>\nusing namespace std;\n\n// Pair Sum\nvector<int> twoSum(vector<int>& nums, int target) {\n        int st = 0, end = nums.size()-1;\n        vector<int> ans;\n\n        while(st < end) {\n            int sum = nums[st] + nums[end];\n            if(sum == target) {\n                ans.push_back(st+1);\n                ans.push_back(end+1);\n                break;\n            } else if(sum > target) {\n                end--;\n            } else {\n                st++;\n            }\n        }\n\n        return ans;\n}\n\nint main() {\n    //Dynamic Allocation & Deallocation\n    //Example - 1\n    int *ptr = new int;\n    *ptr = 100;\n    cout << *ptr << endl;\n    delete ptr;\n    \n    //1D Dynamic Array\n    int size;\n    cout << \"enter size of array : \";\n    cin >> size;\n    int *arr = new int[size];\n\n    for(int i=0; i<size; i++) {\n        arr[i] = i+1;\n        cout << arr[i] << \" \";\n    }\n    cout << endl;\n\n    delete[] arr;\n\n    //2D Dynamic Array\n    int rows, cols;\n    cout << \"enter rows : \";\n    cin >> rows;\n    cout << \"enter cols : \";\n    cin >> cols;\n\n    int **matrix = new int*[rows];\n    for(int i=0; i<rows; i++) {\n        matrix[i] = new int[cols];\n    }\n\n    int x = 1;\n    for(int i=0; i<rows; i++) {\n        for(int j=0; j<cols; j++) {\n            matrix[i][j] = x++;\n            cout << matrix[i][j] << \" \";\n        }\n        cout << endl;\n    }\n\n    //vectors\n    vector<int> vec1;\n\n    vector<int> vec2 = {1, 2, 3, 4};\n\n    vector<int> vec3(5, -1);\n\n    vector<int> vec = {1, 2, 3, 4};\n    cout << vec.size() << endl;\n    cout << vec.capacity() << endl;\n\n    //print elements\n    for(int i=0; i<vec.size(); i++) {\n        cout << vec[i] << \" \";\n    }\n    cout << endl;\n\n    vec.push_back(5);\n    cout << vec.capacity() << endl;\n\n    //2D Vector\n    vector<vector<int>> matrix = {{1}, {2, 3}, {4, 5, 6}};\n\n    for(int i=0; i<matrix.size(); i++) {\n        for(int j=0; j<matrix[i].size(); j++) {\n            cout << matrix[i][j] << \" \";\n        }\n        cout << endl;\n    }\n\n\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "16_Bit_Manipulation/bit_manip.cpp",
    "content": "#include <iostream>\n#include <vector>\nusing namespace std;\n\nbool isPowerOf2(int num) {\n\n    if((num & (num-1)) == 0) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\nvoid updateIthBit(int num, int i, int val) {\n    num = num & ~(1 << i);\n\n    int mask = val << i;\n    num = num | mask;\n\n    cout << num << endl;\n}\n\nvoid clearLastIBits(int num, int i) {\n    int mask = (~0) << i;\n    num = num & mask;\n\n    cout << num << endl;\n}\n\nvoid clearBitsInRange(int num, int i, int j) {\n    int a = (~0) >> (j+1);\n    int b = (1 << i) - 1;\n    int mask = a | b;\n    num = num & mask;\n\n    cout << num << endl;\n}\n\nint countSetBits(int num) {\n    int count = 0;\n    \n    while(num > 0) {\n        if(num & 1) {\n            count++;\n        }\n        num = num >> 1;\n    }\n\n    cout << count << endl;\n    return count;\n}\n\n//calculate x^n\nint fastExponentiation(int x, int n) {\n    int ans = 1;\n\n    while(n > 0) {\n        int lastBit = n & 1;\n        if(lastBit)\n            ans = ans * x;\n\n        x = x*x;\n        n = n >> 1;\n    }\n\n    cout << ans << endl;\n    return ans;\n}\n\nint main() {\n    /* Binary Operators - AND, OR, XOR */\n    int x = 3, y = 5;\n    \n    cout << (x & y) << endl;\n    cout << (x | y) << endl;\n    cout << (x ^ y) << endl;\n\n    //Binary NOT\n    cout << ~0 << endl;\n    cout << ~6 << endl;\n\n    //Binary Shift\n    cout << (7 << 2) << endl;// same as (7 * 2^2)\n    cout << (7 >> 2) << endl;// same as (7 / 2^2)\n\n    //Practice Qs\n    cout << ~4 << endl;\n    cout << (8 >> 1) << endl;\n\n    //Odd or Even\n    int num = 7;\n    bool isOdd = num & 1;\n    cout << (isOdd ? \"odd\" : \"even\") << endl;\n\n    //Get ith bit\n    num = 6;\n    int i = 2;\n    int mask = 1 << i;\n    if(num & mask) {\n        cout << \"bit is 1\\n\";\n    } else {\n        cout << \"bit is 0\\n\";\n    }\n\n    //Set ith bit\n    num = 6;\n    i = 3;\n    mask = 1 << i;\n    num = num | mask;\n    cout << num << endl; //14 is expected;\n\n    //Clear ith Bit\n    num = 6;\n    i = 1;\n    mask = ~(1 << i);\n    num = num & mask;\n    cout << num << endl; //4 is expected; \n\n    //Power of 2\n    cout << isPowerOf2(8) << endl;\n    cout << isPowerOf2(7) << endl;\n\n    //Update ith Bit\n    updateIthBit(7, 2, 0);\n    updateIthBit(7, 3, 1);\n\n    //Clear last i bits\n    clearLastIBits(15, 2);\n\n    //Count Set Bits;\n    countSetBits(10);\n    countSetBits(7);\n\n    //Fast Exponentiation\n    fastExponentiation(3, 4);\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "17_OOPS1/oops1.cpp",
    "content": "#include <iostream>\n#include <string>\nusing namespace std;\n\nclass Student {\nprivate:\n    float cgpa;\n\npublic:\n    string name;\n\n    //Setter\n    void setCgpa(float newCgpa) {\n        if(newCgpa < 0) {\n            cout << \"Invalid Data\\n\";\n            return;\n        }\n        cgpa = newCgpa;\n    }\n\n    //Getter\n    float getCgpa() {\n        return cgpa;\n    }\n\n    void getPercentage() {\n        cout << (cgpa * 10) << \"% \\n\";\n    }\n};\n\nclass Car {\n    string name;\n    int price;\n\npublic:\n    int *mileage;\n    //Contructor\n    Car() {\n        cout << \"Creating & Initializing a new car..\\n\";\n    }\n\n    //Parameterized Contructor\n    Car(string name, int price) {\n        cout << \"Creating & Initializing a new car..\\n\";\n        this->name = name;\n        this->price = price;\n        mileage = new int;\n        *mileage = 12;\n    }\n\n    //Custom Copy Constructor\n    Car(Car &original) {\n        cout << \"copying..\\n\";\n        name = original.name;\n        price = original.price;\n        mileage = new int;\n        *mileage = *original.mileage;\n    }\n\n    //Getter\n    string getName() {\n        return name;\n    }\n\n    int getPrice() {\n        return price;\n    }\n\n    int getMileage() {\n        return *mileage;\n    }\n\n    //Setter\n    // void setMileage(int mileage) {\n    //     mileage = &mileage;\n    // }\n\n    ~Car() {\n        cout << \"object deletion..\\n\";\n        if(mileage != NULL) {\n            delete mileage;\n            mileage = NULL;\n        }\n    }\n};\n\n//Inheritance\nclass Animal {\n    string color;\n\npublic: \n    void eat() {\n        cout << \"eats\\n\";\n    }\n\n    void breathe() {\n        cout << \"breathes\\n\";\n    }\n};\n\nclass Fish : public Animal {\n    int fins;\n\npublic:\n    void swim() {\n        cout << \"swims\\n\";\n    }\n};\n\nint main() {\n    // Student s1;\n    // cout << sizeof(s1) << endl;\n    // s1.name = \"shradha\";\n    // cout << s1.name << endl;\n\n    // //Setter\n    // s1.setCgpa(9.0);\n\n    // //Getter\n    // cout << s1.getCgpa() << endl;\n    // s1.getPercentage();\n\n    //Contructors\n    // Car c1(\"maruti 800\", 4);\n    // cout << c1.getName() << endl;\n    // cout << c1.getMileage() << endl;\n\n\n    //Default Copy Constructor\n    // Car c2(c1);\n    // cout << \"**************\\n\";\n    // cout << c1.getName() << endl;\n    // cout << c1.getPrice() << endl;\n    // cout << c2.getMileage() << endl;\n\n    // *c2.mileage = 15;\n    // cout << c2.getMileage() << endl;\n    // cout << c1.getMileage() << endl;\n\n    //Inheritance\n    Fish f1;\n    f1.eat();\n    f1.swim();\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "18_OOPS2/oops2.cpp",
    "content": "#include <iostream>\n#include <string>\nusing namespace std;\n\n//Function Overloading\nclass Print {\npublic:\n    void show(int x) {\n        cout << \"int : \" << x << endl;\n    }\n\n    void show(string str) {\n        cout << \"string : \" << str << endl;\n    }\n};\n\n//Operator Overloading\nclass Complex {\n    int real;\n    int img;\n\npublic:\n    Complex(int r, int i) {\n        real = r;\n        img = i;\n    }\n\n    void showNum() {\n        cout << real << \" + \" <<  img << \"i\\n\";\n    }\n\n    Complex operator - (Complex &obj) {\n        int resReal = this->real - obj.real;\n        int resImg = this->img - obj.img;\n        Complex res(resReal, resImg);\n        return res;\n    }\n\n    Complex operator + (Complex &obj) {\n        int resReal = this->real + obj.real;\n        int resImg = this->img + obj.img;\n        Complex res(resReal, resImg);\n        return res;\n    }\n};\n\n//Function Overriding & Virtual Function\nclass Parent {\npublic:\n    void show() {\n        cout << \"parent show\\n\";\n    }\n\n    virtual void hello() {\n        cout << \"hello from parent\\n\";\n    }\n};\n\nclass Child : public Parent {\npublic:\n    void show() {\n        cout << \"child show\\n\";\n    }  \n\n    void hello() {\n        cout << \"hello from child\\n\";\n    }\n};\n\n//Abstract Classes & Pure Virtual Functions\n\nclass Shape {\n    //This is an abstract class\npublic:\n    virtual void draw() = 0; //Pure Virtual Function\n};\n\nclass Square : public Shape {\npublic:\n    void draw() {\n        cout << \"drawing a rectangle\\n\";\n    }\n};\n\nclass Circle : public Shape {\npublic:\n    void draw() {\n        cout << \"drawing a circle\\n\";\n    }\n};\n\n//Static \nvoid counter() {\n    static int count = 0;\n    count++;\n    cout << \"count : \" << count << endl;\n}\n\nclass Example {\npublic:\n    Example() {\n        cout << \"constructor\\n\";\n    }\n\n    ~Example() {\n        cout << \"destructor\\n\";\n    }\n};\n\n//Friend Class & Function\nclass A {\n    string secret = \"private secret\";\n    friend class B;\n    friend void shareSecret(A &obj);\n};\n\nclass B {\npublic:\n    void showSecret(A &obj) {\n        cout << obj.secret << endl;\n    }\n};\n\nvoid shareSecret(A &obj) {\n        cout << obj.secret << endl;\n}\n\nint main() {\n    Print p1;\n    p1.show(50);\n    p1.show(\"apnacollege\");\n    \n    Complex num1(1, 2);\n    Complex num2(3, 4);\n    Complex res = num1 + num2;\n    res.showNum();\n\n    Child c1;\n    c1.show();\n    \n    Child c2;\n    Parent *par1;\n    par1 = &c2; //Binding at runtime\n    par1->hello();\n    \n    Circle cir1;\n    Square squ1;\n    cir1.draw();\n    squ1.draw();\n\n    counter();\n    counter();\n    counter();\n\n    //Static object\n    int x = 0;\n    if(x == 0) {\n        static Example eg1;\n    }\n    cout << \"exiting main function.\\n\";\n\n    A a1;\n    B b1;\n    b1.showSecret(a1);\n    shareSecret(a1);\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "19_Recursion1/recursion1.cpp",
    "content": "#include <iostream>\n#include <string>\n#include <vector>\nusing namespace std;\n\n//Simple Recursive Function with Stack Overflow\nvoid func() {\n    cout << \"function call\\n\";\n    func();\n}\n\n//Factorial \nint factorial(int n) {\n    if(n == 1) {\n        return 1;\n    }\n    return n * factorial(n-1);\n}\n\n//Print Decreasing\nvoid print(int n) {\n    if(n == 0) {\n        return;\n    }\n\n    cout << n << \" \";\n    print(n-1);\n}\n\n//Sum of N Natural Numbers\nint sum(int n) {\n    if(n == 1) {\n        return 1;\n    }\n\n    return n + sum(n-1);\n}\n\n//Nth Fibonacci\nint fibonacci(int n) {\n    if(n == 0 || n == 1) {\n        return n;\n    }\n\n    return fibonacci(n-1) + fibonacci(n-2);\n}\n\n//Is Array Sorted\nbool isSorted(int arr[], int i, int n) {\n    if(i == n-1) {\n        return true;\n    }\n\n    if(arr[i] > arr[i+1]) {\n        return false;\n    }\n\n    return isSorted(arr, i+1, n);\n}\n\n//First Occurrence\nint firstOccur(vector<int> vec, int target, int i) {\n    if(i == vec.size()) {\n        return -1;\n    }\n\n    if(vec[i] == target) {\n        return i;\n    }\n\n    return firstOccur(vec, target, i+1);\n}\n\n//Last Occurrence\nint lastOccur(vector<int> vec, int target, int i) {\n    if(i == vec.size()) {\n        return -1;\n    }\n\n    int idxFound = lastOccur(vec, target, i+1);\n    \n    if(idxFound == -1 && vec[i] == target) {\n        return i;\n    }\n\n    return idxFound;\n}\n\n//X^N\nint pow(int x, int n) {\n    if(n == 0) {\n        return 1;\n    }\n\n    int halfPow = pow(x, n/2);\n    int halfPowSquare = halfPow * halfPow;\n    if(n % 2 == 0) {\n        //even\n        return halfPowSquare;\n    } else {\n        return x * halfPowSquare;\n    }\n}\n\nint main() {\n    cout << factorial(5) << endl;\n\n    print(6);\n    cout << endl;\n\n    cout << sum(5) << endl;\n\n    cout << fibonacci(6) << endl;\n\n    int arr1[5] = {1, 2, 3, 4, 5};\n    int arr2[5] = {1, 2, 4, 3, 5};\n    cout << isSorted(arr1, 0, 5) << endl;\n    cout << isSorted(arr2, 0, 5) << endl;\n\n    vector<int> vec = {1, 2, 3, 3, 3, 4};\n    cout << firstOccur(vec, 3, 0) << endl;\n    cout << lastOccur(vec, 3, 0) << endl;\n\n    cout << pow(2, 10) << endl;\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "20_Recursion2/rec2.cpp",
    "content": "#include <iostream>\n#include <string>\nusing namespace std;\n\n//Tiling Problem\nint countWays(int n) {\n    if(n == 0 || n == 1) {\n        return 1;\n    }\n\n    //vertical choice\n    int ways1 = countWays(n-1);\n\n    //horizonal choice\n    int ways2 = countWays(n-2);\n\n    return ways1 + ways2;\n}\n\n//Remove Duplicates\nvoid removeDuplicates(string str, int i, bool map[26], string ans) {\n    if(i == str.length()) {\n        cout << \"ans : \" << ans << endl;\n        return;\n    }\n\n    int mapIdx = (int)(str.at(i) - 'a');\n\n    if(map[mapIdx]) {\n        removeDuplicates(str, i+1, map, ans);\n    } else {\n        map[mapIdx] = true;\n        removeDuplicates(str, i+1, map, ans+str.at(i));\n    }\n    \n}\n\n//Friends Pairing Problem\nint pairFriends(int n) {\n    if(n == 1 || n == 2) {\n        return n;\n    }\n\n    return pairFriends(n-1) + (n-1) * pairFriends(n-2);\n}\n\n//Binary Strings Problem\nvoid binStrings(int n, string ans, int lastPlace) {\n    if(n == 0) {\n        cout << ans << endl;\n        return;\n    }\n\n    binStrings(n-1, ans+'0', 0);\n\n    if(lastPlace != 0) {\n        binStrings(n-1, ans+'1', 1);\n    }\n}\n\nvoid binStrings(int n, string ans) {\n    if(n == 0) {\n        cout << ans << endl;\n        return;\n    }\n\n    binStrings(n-1, ans+'0');\n\n    if(ans[ans.size()-1] != '1') {\n        binStrings(n-1, ans+'1');\n    }\n}\n\nint main() {\n    cout << countWays(4) << endl;\n\n    string ans = \"\";\n    bool map[26] = {false};\n    removeDuplicates(\"appnnacollege\", 0, map, ans); //apncoleg\n\n    cout << pairFriends(3) << endl;\n\n    ans = \"\";\n    //binStrings(3, ans, 0);\n\n    binStrings(3, ans);\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "21_Divide_and_Conquer/divideAndConquer.cpp",
    "content": "#include <iostream>\n#include <vector>\nusing namespace std;\n\nvoid printArr(int arr[], int n) {\n    for(int i=0; i<n; i++) {\n        cout << arr[i] << \" \";\n    }\n    cout << endl;\n}\n\nvoid merge(int arr[], int si, int mid, int ei) {\n    vector<int> temp;\n    int i=si, j=mid+1;\n\n    while(i <= mid && j <= ei) {\n        if(arr[i] <= arr[j]) {\n            temp.push_back(arr[i++]);\n        } else {\n            temp.push_back(arr[j++]);\n        }\n    }\n\n    while(i <= mid) {\n        temp.push_back(arr[i++]);\n    } \n\n    while(j <= ei) {\n        temp.push_back(arr[j++]);\n    }\n\n    //copy back to original\n    for(int idx=si, x=0; idx<=ei; idx++) {\n        arr[idx] = temp[x++];\n    }    \n}\n\nvoid mergeSort(int arr[], int si, int ei) {\n    if(si >= ei) {\n        return;\n    }\n\n    int mid = si + (ei - si)/2;\n    mergeSort(arr, si, mid);\n    mergeSort(arr, mid+1, ei);\n    \n    merge(arr, si, mid, ei);\n}\n\nint partition(int arr[], int si, int ei) {\n    int pivot = arr[ei];\n    int i=si-1;\n\n    for(int j=si; j<ei; j++) {\n        if(arr[j] <= pivot) {\n            i++;\n            swap(arr[i], arr[j]);\n        }\n    }\n\n    i++;\n    swap(arr[i], arr[ei]);\n\n    return i;\n}\n\nvoid quickSort(int arr[], int si, int ei) {\n    if(si >= ei) {\n        return;\n    }\n\n    int pivotIdx = partition(arr, si, ei);\n    quickSort(arr, si, pivotIdx-1); //left\n    quickSort(arr, pivotIdx+1, ei); //right\n}\n\nint search(int arr[], int si, int ei, int tar) {\n    if(si > ei) {\n        return -1;\n    }\n\n    int mid = si + (ei - si)/2;\n\n    if(arr[mid] == tar) {\n        return mid;\n    }\n\n    if(arr[si] <= arr[mid]) { //Line 1\n        if(arr[si] <= tar && tar <= arr[mid]) {\n            //go left\n            return search(arr, si, mid-1, tar);\n        } else {\n            //go right\n            return search(arr, mid+1, ei, tar);\n        }\n    } else {\n        //Line2\n        if(tar >= arr[mid] && tar <= arr[ei]) {\n            //go right\n            return search(arr, mid+1, ei, tar);\n        } else {\n            //go left\n            return search(arr, si, mid-1, tar);\n        }\n    }\n}\n\nint main() {\n    int arr[6] = {6, 3, 7, 5, 2, 4};\n    int n = 6;\n    \n    //mergeSort(arr, 0, n-1);\n\n    quickSort(arr, 0, n-1);\n    printArr(arr, n);\n\n    int arr2[7] = {4, 5, 6, 7, 0, 1, 2};\n    int tar = 0;\n    cout << \"idx : \" << search(arr2, 0, 6, tar) << endl;\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "24_Backtracking/backtracking.cpp",
    "content": "#include <iostream>\n#include <string>\n#include <vector>\nusing namespace std;\n\nvoid printArr(int arr[], int n) {\n    for(int i=0; i<n; i++) {\n        cout << arr[i] << \" \";\n    }\n\n    cout << endl;\n}\n\nvoid changeArr(int arr[], int n, int i) {\n    if(i == n) {\n        printArr(arr, n);\n        return;\n    }\n\n    arr[i] = i+1;\n    changeArr(arr, n, i+1);\n    arr[i] -= 2;\n}\n\nvoid allSubsets(string str, int i, string subset) {\n    if(i == str.size()) {\n        cout << subset << endl;\n        return;\n    }\n\n    char ch = str[i];\n    allSubsets(str, i+1, subset);\n    allSubsets(str, i+1, subset+ch);\n}\n\nvoid allPermutations(string str, string ans) {\n    if(str.size() == 0) {\n        cout << ans << endl;\n        return;\n    }\n\n    for(int i=0; i<str.size(); i++) {\n        string newStr = str.substr(0, i) + str.substr(i+1, i+str.size());\n        allPermutations(newStr, ans+str[i]);\n    }\n}\n\nvoid printBoard(vector<vector<char>> board) {\n    int n = board.size();\n    for(int i=0; i<n; i++) {\n        for(int j=0; j<n; j++) {\n            cout << board[i][j] << \" \";\n        }\n        cout << endl;\n    }\n\n    cout << \"---------------\\n\";\n}\n\nbool isSafe(vector<vector<char>> board, int row, int col) {\n    int n = board.size();\n    //vertical\n    for(int j=0; j<col; j++) {\n        if(board[row][j] == 'Q') {\n            return false;\n        }\n    }\n\n    //horizontal\n    for(int i=0; i<row; i++) {\n        if(board[i][col] == 'Q') {\n            return false;\n        }\n    }\n\n    //diagonal left\n    for(int i=row-1, j=col-1; i>=0 && j>=0; i--, j--) {\n        if(board[i][j] == 'Q') {\n            return false;\n        }\n    }\n\n    //diagonal right\n    for(int i=row-1, j=col+1; i>=0 && j<n; i--, j++) {\n        if(board[i][j] == 'Q') {\n            return false;\n        }\n    }\n    return true;\n}\n\n\nint nQueens(vector<vector<char>> board, int row) {\n    int n = board.size();\n    if(row == n) {\n        printBoard(board);\n        return 1;\n    }\n\n    int count = 0;\n    for(int j=0; j<n; j++) {\n        if(isSafe(board, row, j)) {\n            board[row][j] = 'Q';\n            count += nQueens(board, row+1);\n            board[row][j] = '.';\n        }\n    }\n\n    return count;\n}\n\nint gridWays(int i, int j, int n, int m) {\n    if(i == n-1 && j == m-1) {\n        return 1;\n    }\n\n    if(i >= n || j >= m) {\n        return 0;\n    }\n\n    int totWays = 0;\n    \n    //go right\n    totWays += gridWays(i, j+1, n, m);\n\n    //go down\n    totWays += gridWays(i+1, j, n, m);\n\n    return totWays;\n}\n\nbool isSafe(int sudoku[9][9], int row, int col, int val) {\n    //same col\n    for(int i=0; i<9; i++) {\n        if(sudoku[i][col] == val) {\n            return false;\n        }\n    }\n\n     //same row\n    for(int j=0; j<9; j++) {\n        if(sudoku[row][j] == val) {\n            return false;\n        }\n    }\n\n    //same 3x3 grid\n    int sr = (row/3) * 3;\n    int sc = (col/3) * 3;\n\n    for(int i=sr; i<sr+3; i++) {\n        for(int j=sc; j<sc+3; j++) {\n            if(sudoku[i][j] == val) {\n                return false;\n            }\n        }\n    }\n\n    return true;\n}\n\nbool sudokuSolver(int sudoku[9][9], int row, int col) {\n    cout << \"row = \" << row << \" , col = \" << col << endl;\n    if(row == 9) {\n        for(int i=0; i<9; i++) {\n            for(int j=0; j<9; j++) {\n                cout << sudoku[i][j] << \" \";\n            }\n            cout << endl;\n        }\n\n        return true;\n    } \n\n    int nextRow = row;\n    int nextCol = col + 1;\n\n    if(nextCol == 9) {\n        nextRow = row+1;\n        nextCol = 0;\n    }\n\n    if(sudoku[row][col] != 0) {\n        return sudokuSolver(sudoku, nextRow, nextCol);\n    }\n\n    for(int digit=1; digit<=9; digit++) {\n        if(isSafe(sudoku, row, col, digit)) {\n            sudoku[row][col] = digit;\n            if(sudokuSolver(sudoku, nextRow, nextCol)) {\n                return true;\n            }\n            sudoku[row][col] = 0;\n        }\n    }\n\n    return false;\n}\n\nint main() {\n    int arr[5];\n    int n = 5;\n    changeArr(arr, n, 0);\n    printArr(arr, n);\n\n    string str = \"abc\";\n    string ans = \"\";\n    allSubsets(str, 0, ans);\n    cout << \"--------------------------\\n\";\n\n    allPermutations(str, ans);\n    cout << \"--------------------------\\n\";\n\n    int n = 4;\n    vector<vector<char>> board;\n    \n    for(int i=0; i<n; i++) {\n        vector<char> newRow;\n        for(int j=0; j<n; j++) {\n            newRow.push_back('.');\n        }\n        board.push_back(newRow);\n    }\n\n    int count = nQueens(board, 0);\n    cout << \"total ways : \" << count << endl;\n\n    \n    cout << gridWays(0, 0, 3, 3) << endl;\n\n    int sudoku[9][9] = {{0, 0, 8, 0, 0, 0, 0, 0, 0}, \n                        {4, 9, 0, 1, 5, 7, 0, 0, 2},\n                        {0, 0, 3, 0, 0, 4, 1, 9, 0},\n                        {1, 8, 5, 0, 6, 0, 0, 2, 0},\n                        {0, 0, 0, 0, 2, 0, 0, 6, 0},\n                        {9, 6, 0, 4, 0, 5, 3, 0, 0},\n                        {0, 3, 0, 0, 7, 2, 0, 0, 4},\n                        {0, 4, 9, 0, 3, 0, 0, 5, 7},\n                        {8, 2, 7, 0, 0, 9, 0, 1, 3}};\n\n    sudokuSolver(sudoku, 0, 0);\n    return 0;    \n}\n\n\n"
  },
  {
    "path": "25_LinkedList1/ll1.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nclass Node {\npublic:\n    int data;\n    Node* next;\n\n    Node(int data) {\n        this->data = data;\n        next = NULL;\n    }\n\n    ~Node() {\n        if(next != NULL) {\n            delete next;\n            next = NULL;\n        }\n    }\n};\n\nclass List {\n    Node* head;\n    Node* tail;\n\npublic:\n    List() {\n        head = NULL;\n        tail = NULL;\n    }\n\n    void push_front(int val) {\n        Node* newNode = new Node(val);\n\n        if(tail == NULL) {\n            head = tail = newNode;\n        } else {\n            newNode->next = head;\n            head = newNode;\n        }\n    }\n\n    void push_back(int val) {\n        Node* newNode = new Node(val);\n\n        if(tail == NULL) {\n            head = tail = newNode;\n        } else {\n            tail->next = newNode;\n            tail = newNode;\n        }\n    }\n\n    void printList() {\n        Node* temp = head;\n        while(temp != NULL) {\n            cout << temp->data << \" -> \";\n            temp = temp->next;\n        }\n        cout << \"NULL\\n\";\n    }\n\n    void insert(int val, int pos) {\n        if(pos == 0) {\n            push_front(val);\n            return;\n        }\n\n        Node* temp = head;\n        int i=0;\n        while(temp != NULL && i<pos-1) {\n            temp = temp->next;\n            i++;\n        }\n\n        if(temp == NULL) {\n            cout << \"Invalid position\\n\";\n            return;\n        }\n\n        Node* newNode = new Node(val);\n        newNode->next = temp->next;\n        temp->next = newNode;\n    }\n\n    void pop_front() {\n        if(head == NULL) {\n            return;\n        }\n\n        Node* temp = head;\n        head = head->next;\n        \n        temp->next = NULL;\n        delete temp;\n    }\n\n    void pop_back() {\n        if(head == NULL) { //0 els\n            return;\n        }\n        if(head->next == NULL) { //1 el\n            delete head;\n            head = NULL;\n            return;\n        }\n\n        Node* temp = head;\n        while(temp->next->next != NULL) {\n            temp = temp->next;\n        }\n        //temp has tail's prev\n        temp->next = NULL;\n        \n        delete tail;\n        tail = temp;\n    }\n\n    ~List() {\n        if(head != NULL) {\n            delete head; \n            head = NULL; \n        }\n    }\n\n    int searchItr(int key) {\n        Node* temp = head;\n        int idx = 0;\n\n        while(temp != NULL) {\n            if(temp->data == key) {\n                return idx;\n            }\n            temp = temp->next;\n            idx++;\n        }\n        \n        return -1;\n    }\n\n    int searchRec(int key) {\n        return searchHelper(head, key);\n    }\n\n    int searchHelper(Node* h, int key) {\n        if(h == NULL) {\n            return -1;\n        }\n\n        if(h-> data == key) {\n            return 0; //current idx\n        }\n\n        int ans = searchHelper(h->next, key);\n        if(ans == -1) {\n            return -1;\n        }\n\n        return ans + 1;\n    }\n\n    void reverseLL() {\n        Node* prev = NULL;\n        Node* curr = head;\n\n        while(curr != NULL) {\n            Node* next = curr->next;\n            curr->next = prev;\n\n            prev = curr;\n            curr = next;\n        }\n\n        head = prev;\n    }\n\n    int sizeLL() {\n        Node* temp = head;\n        int sz = 0;\n\n        while(temp != NULL) {\n            temp = temp->next;\n            sz++;\n        }\n        return sz;\n    }\n\n    void removeNth(int n) {\n        int size = sizeLL();\n        cout << \"size : \" << size << endl;\n        if(n == size) {\n            pop_front();\n            return;\n        }\n\n        Node* temp = head;\n        for(int i=1; i<size-n; i++) {\n            temp = temp->next;\n        }\n\n        Node* toDel = temp->next; //node to delete\n        temp->next = temp->next->next;\n    }\n}; \n\nint main() {\n        List ll;\n\n        ll.push_front(5);\n        ll.push_front(4);\n        ll.push_front(3);\n        ll.push_front(2);\n        ll.push_front(1);\n\n       ll.printList();\n       ll.removeNth(2); //delete 4\n       ll.printList();\n       return 0;\n}\n\n\n\n\n\n\n"
  },
  {
    "path": "26_LinkedList2/doubly_linkedlist.cpp",
    "content": "#include <iostream>\nusing namespace std;\n\nclass Node {\npublic:\n    int data;\n    Node* next;\n    Node* prev;\n\n    Node(int data) {\n        this->data = data;\n        next = prev = NULL;\n    }\n};\n\nclass DoublyList {\npublic:\n    Node* head;\n    Node* tail;\n\n    DoublyList() {\n        head = NULL;\n        tail = NULL;\n    }\n\n    void push_front(int val) {\n        Node* newNode = new Node(val);\n        if(head == NULL) {\n            head = tail = newNode;\n        } else {\n            head->prev = newNode;\n            newNode->next = head;\n            head = newNode;\n        }\n    }\n\n    void printList() {\n        Node* temp = head;\n        while(temp != NULL) {\n            cout << temp->data << \" <=> \";\n            temp = temp->next;\n        }\n        cout << \"NULL\" << endl;\n    }\n\n    void pop_front() {\n        cout << \"deleting : \" << head->data << endl;\n        Node* temp = head;\n        head = head->next;\n        if(head != NULL) {\n            head->prev = NULL;\n        }\n        temp->next = NULL;\n        delete temp;\n    }\n\n    \n};\n\nint main() {\n    DoublyList dll;\n    \n    dll.push_front(3);\n    dll.push_front(2);\n    dll.push_front(1);\n\n    dll.printList();\n\n    dll.pop_front();\n    dll.printList();\n}"
  },
  {
    "path": "26_LinkedList2/linkedlist.cpp",
    "content": "#include <iostream>\n#include <string>\n#include <vector>\nusing namespace std;\n\nclass Node {\npublic:\n    int data;\n    Node* next;\n\n    Node(int data) {\n        this->data = data;\n        next = NULL;\n    }\n\n    // ~Node() {\n    //     if(next != NULL) {\n    //         delete next;\n    //         next = NULL;\n    //     }\n    // }\n};\n\nclass List {\npublic:\n    Node* head;\n    Node* tail;\n\n    List() {\n        head = NULL;\n        tail = NULL;\n    }\n\n    void push_front(int val) {\n        Node* newNode = new Node(val);\n\n        if(tail == NULL) {\n            head = tail = newNode;\n        } else {\n            newNode->next = head;\n            head = newNode;\n        }\n    }\n\n    void push_back(int val) {\n        Node* newNode = new Node(val);\n\n        if(head == NULL) {\n            head = tail = newNode;\n        } else {\n            tail->next = newNode;\n            tail = newNode;\n        }\n    }\n\n    void printList() {\n        Node* temp = head;\n        while(temp != NULL) {\n            cout << temp->data << \" -> \";\n            temp = temp->next;\n        }\n        cout << \"NULL\\n\";\n    }\n\n    void insert(int val, int pos) {\n        if(pos == 0) {\n            push_front(val);\n            return;\n        }\n\n        Node* temp = head;\n        int i=0;\n        while(temp != NULL && i<pos-1) {\n            temp = temp->next;\n            i++;\n        }\n\n        if(temp == NULL) {\n            cout << \"Invalid position\\n\";\n            return;\n        }\n\n        Node* newNode = new Node(val);\n        newNode->next = temp->next;\n        temp->next = newNode;\n    }\n\n    void pop_front() {\n        if(head == NULL) {\n            return;\n        }\n\n        Node* temp = head;\n        head = head->next;\n        \n        temp->next = NULL;\n        delete temp;\n    }\n\n    void pop_back() {\n        if(head == NULL) { //0 els\n            return;\n        }\n        if(head->next == NULL) { //1 el\n            delete head;\n            head = NULL;\n            return;\n        }\n\n        Node* temp = head;\n        while(temp->next->next != NULL) {\n            temp = temp->next;\n        }\n        //temp has tail's prev\n        temp->next = NULL;\n        \n        delete tail;\n        tail = temp;\n    }\n\n    // ~List() {\n    //     if(head != NULL) {\n    //         delete head; \n    //         head = NULL; \n    //     }\n    // }  \n};\n\n//cycle detection\nbool isCycle(Node* head) {\n    Node* slow = head;\n    Node* fast = head;\n\n    while(fast != NULL && fast->next != NULL) {\n        slow = slow->next;\n        fast = fast->next->next;\n\n        if(slow == fast) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\nvoid removeCycle(Node* head) {\n    Node* slow = head;\n    Node* fast = head;\n    bool isCycle = false;\n\n    while(fast != NULL && fast->next != NULL) {\n        slow = slow->next;\n        fast = fast->next->next;\n\n        if(slow == fast) {\n            isCycle = true;\n            break;\n        }\n    }\n\n    if(!isCycle) {\n        return;\n    }\n\n    //Removing Loop\n    slow = head;\n\n   if(slow == fast) { \n    //special case when tail is connected to head\n        while(fast->next != slow) {\n            fast = fast->next;\n        }\n        fast->next = NULL;\n\n   } else {\n        Node* prev = fast;\n        while(slow != fast) {\n            prev = fast;\n            slow = slow->next;\n            fast = fast->next;\n        }\n\n        //prev is the last node\n        prev->next = NULL;\n   }\n}\n\nNode* splitAtMid(Node* head) {\n    Node* slow = head;\n    Node* fast = head;\n    Node* prev = NULL;\n\n    while(fast != NULL && fast->next != NULL) {\n        prev = slow;\n        slow = slow->next;\n        fast = fast->next->next;\n    }\n\n    if(prev != NULL) {\n        prev->next = NULL;\n    }\n\n    return slow;\n}\n\nNode* merge(Node* h1, Node*h2) {\n    List ans;\n    Node* i = h1;\n    Node* j = h2;\n\n    while(i != NULL && j != NULL) {\n        if(i->data <= j->data) {\n            ans.push_back(i->data);\n            i = i->next;\n        } else {\n            ans.push_back(j->data);\n            j = j->next;\n        }\n    }\n\n    while(i != NULL) {\n        ans.push_back(i->data);\n        i = i->next;\n    }\n\n    while(j != NULL) {\n        ans.push_back(j->data);\n        j = j->next;\n    }\n    return ans.head;\n}\n\nNode* mergeSort(Node* head) {\n    if(head == NULL || head->next == NULL) {\n        return head;\n    }\n\n    Node* rightHead = splitAtMid(head);\n    Node* sortedLeft = mergeSort(head);\n    Node* sortedRight =mergeSort(rightHead);\n\n    return merge(sortedLeft, sortedRight);\n}\n\nNode* reverse(Node* head) {\n    Node* prev = NULL;\n    Node* curr = head;\n\n    while(curr != NULL) {\n        Node* next = curr->next;\n\n        curr->next = prev;\n        prev = curr;\n        curr = next;\n    }\n\n    return prev; // prev is head\n}\n\nvoid printList(Node* head) {\n    Node* temp = head;\n\n    while(temp != NULL) {\n        cout << temp->data << \" \";\n        temp = temp->next;\n    }\n    cout << endl;\n}\n\nNode* zigzag(Node* head) {\n    Node* rightHead = splitAtMid(head);\n    Node* rightRev = reverse(rightHead);\n\n    //alternate merging\n    Node* left = head;\n    Node* right = rightRev;\n    Node* nextLeft = NULL;\n    Node* nextRight = NULL;\n    Node* tail = head;\n\n    while(left != NULL && right != NULL) {\n        nextLeft = left->next;\n        left->next = right;\n\n        nextRight = right->next;\n        right->next = nextLeft;\n\n        tail = right;\n        left = nextLeft;\n        right = nextRight;\n    }\n\n    if(right != NULL) {\n        tail->next = right;\n    }\n    return head;\n}\n\nint main(){\n       List ll;\n\n       //QS : Cycle Detection & Removal\n       /* ll.push_front(4);\n       ll.push_front(3);\n       ll.push_front(2);\n       ll.push_front(1);\n\n       ll.tail->next = ll.head; //creating a cycle\n\n        cout << isCycle(ll.head) << endl;\n        removeCycle(ll.head);\n        cout << isCycle(ll.head) << endl;\n        ll.printList(); */\n\n        //QS : Merge Sort the Linked List\n        // ll.push_front(1);\n        // ll.push_front(2);\n        // ll.push_front(3);\n        // ll.push_front(4);\n        // ll.printList();\n\n        // ll.head = mergeSort(ll.head);\n        // ll.printList();\n\n        //QS : Zig Zag Linked List\n        ll.push_front(5);\n        ll.push_front(4);\n        ll.push_front(3);\n        ll.push_front(2);\n        ll.push_front(1);\n        ll.printList();\n\n        ll.head = zigzag(ll.head);\n        ll.printList();\n}\n"
  },
  {
    "path": "26_LinkedList2/list_using_stl.cpp",
    "content": "#include <iostream>\n#include <list>\n#include <iterator>\nusing namespace std;\n\nvoid printList(list<int> ll) {\n    list<int>::iterator itr;\n    for(itr=ll.begin(); itr!=ll.end(); itr++) {\n        cout << *itr << \" \";\n    }\n    cout << endl;\n}\n\nint main() {\n    list<int> ll;\n\n    ll.push_front(2);\n    ll.push_front(1);\n\n    ll.push_back(3);\n    ll.push_back(4);\n\n    cout << \"size : \" << ll.size() << endl;\n\n    printList(ll);\n    \n    cout << \"head = \" << ll.front() << endl;\n    cout << \"tail = \" << ll.back() << endl;\n\n    ll.pop_front();\n    ll.pop_back();\n\n    printList(ll);\n    return 0;\n}"
  },
  {
    "path": "README.md",
    "content": "# Cpp-DSAClasses\nThis repo contains the codes of C++ DSA Batch of Apna College.\n"
  }
]