diff --git a/Array_Functions/Permutations/permutations_iterative.cpp b/Array_Functions/Permutations/permutations_iterative.cpp new file mode 100644 index 0000000..1e5dc96 --- /dev/null +++ b/Array_Functions/Permutations/permutations_iterative.cpp @@ -0,0 +1,41 @@ +#include +#include +#include + +using namespace std; + +template +vector> generatePermutations(vector arr) { + vector> permutations; + sort(arr.begin(), arr.end()); + permutations.push_back(arr); + while (true) { + int i = arr.size()-2; + while (i >= 0 && arr[i] >= arr[i + 1]) { + i--; + } + if (i < 0) break; + int j = arr.size()-1; + while (arr[j] <= arr[i]) { + j--; + } + swap(arr[i], arr[j]); + reverse(arr.begin() + i + 1, arr.end()); + permutations.push_back(arr); + } + return permutations; +} + +int main() { + vector arr = {1, 3, 2}; + vector> permutations = generatePermutations(arr); + + for (const auto& perm : permutations) { + for (const auto& elem : perm) { + cout << elem << " "; + } + cout << endl; + } + + return 0; +} diff --git a/Array_Functions/Permutations/permutations_iterative.java b/Array_Functions/Permutations/permutations_iterative.java new file mode 100644 index 0000000..a908c14 --- /dev/null +++ b/Array_Functions/Permutations/permutations_iterative.java @@ -0,0 +1,39 @@ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Main { + public static > List> generatePermutations(List arr) { + List> permutations = new ArrayList<>(); + Collections.sort(arr); + permutations.add(new ArrayList<>(arr)); + while (true) { + int i = arr.size() - 2; + while (i >= 0 && arr.get(i).compareTo(arr.get(i + 1)) >= 0) { + i--; + } + if (i < 0) break; + int j = arr.size() - 1; + while (arr.get(j).compareTo(arr.get(i)) <= 0) { + j--; + } + Collections.swap(arr, i, j); + Collections.reverse(arr.subList(i + 1, arr.size())); + permutations.add(new ArrayList<>(arr)); + } + return permutations; + } + + public static void main(String[] args) { + List arr = Arrays.asList(1, 3, 2); + List> permutations = generatePermutations(arr); + + for (List perm : permutations) { + for (Integer elem : perm) { + System.out.print(elem + " "); + } + System.out.println(); + } + } +} diff --git a/Array_Functions/Permutations/permutations_iterative.py b/Array_Functions/Permutations/permutations_iterative.py new file mode 100644 index 0000000..4118556 --- /dev/null +++ b/Array_Functions/Permutations/permutations_iterative.py @@ -0,0 +1,27 @@ +def generate_permutations(arr): + permutations = [] + arr.sort() + permutations.append(arr[:]) + + while True: + i = len(arr) - 2 + while i >= 0 and arr[i] >= arr[i + 1]: + i -= 1 + if i < 0: + break + j = len(arr) - 1 + while arr[j] <= arr[i]: + j -= 1 + + arr[i], arr[j] = arr[j], arr[i] + arr = arr[:i + 1] + arr[i + 1:][::-1] + permutations.append(arr[:]) + + return permutations + +if __name__ == "__main__": + arr = ['a', 'b', 'c', 'd'] + permutations = generate_permutations(arr) + + for perm in permutations: + print(" ".join(map(str, perm))) diff --git a/Array_Functions/Permutations/permutations_recursive.cpp b/Array_Functions/Permutations/permutations_recursive.cpp new file mode 100644 index 0000000..a21d046 --- /dev/null +++ b/Array_Functions/Permutations/permutations_recursive.cpp @@ -0,0 +1,37 @@ +#include +#include +using namespace std; + +template +void generatePermutations(vector& arr, int l, int r, vector>& result) { + if (l == r) { + result.push_back(arr); + } else { + for (int i = l; i <= r; i++) { + swap(arr[l], arr[i]); + generatePermutations(arr, l + 1, r, result); + swap(arr[l], arr[i]); + } + } +} + +template +vector> getPermutations(vector arr) { + vector> result; + generatePermutations(arr, 0, arr.size() - 1, result); + return result; +} + +int main() { + vector arr = {1, 2, 4, 3}; + vector> permutations = getPermutations(arr); + + for (const auto& perm : permutations) { + for (const auto& elem : perm) { + cout << elem << " "; + } + cout << endl; + } + + return 0; +} diff --git a/Array_Functions/Permutations/permutations_recursive.java b/Array_Functions/Permutations/permutations_recursive.java new file mode 100644 index 0000000..868e328 --- /dev/null +++ b/Array_Functions/Permutations/permutations_recursive.java @@ -0,0 +1,46 @@ +import java.util.ArrayList; +import java.util.List; + +public class Permutations { + + private static void generatePermutations(List arr, int l, int r, List> result) { + if (l == r) { + result.add(new ArrayList<>(arr)); + } else { + for (int i = l; i <= r; i++) { + swap(arr, l, i); + generatePermutations(arr, l + 1, r, result); + swap(arr, l, i); + } + } + } + + private static List> getPermutations(List arr) { + List> result = new ArrayList<>(); + generatePermutations(arr, 0, arr.size() - 1, result); + return result; + } + + private static void swap(List arr, int i, int j) { + T temp = arr.get(i); + arr.set(i, arr.get(j)); + arr.set(j, temp); + } + + public static void main(String[] args) { + List arr = new ArrayList<>(); + arr.add(1); + arr.add(2); + arr.add(4); + arr.add(3); + List> permutations = getPermutations(arr); + + for (List perm : permutations) { + for (Integer elem : perm) { + System.out.print(elem + " "); + } + System.out.println(); + } + } +} + diff --git a/Array_Functions/Permutations/permutations_recursive.py b/Array_Functions/Permutations/permutations_recursive.py new file mode 100644 index 0000000..d9c591c --- /dev/null +++ b/Array_Functions/Permutations/permutations_recursive.py @@ -0,0 +1,20 @@ +def generate_permutations(arr, l, r, result): + if l == r: + result.append(arr[:]) + else: + for i in range(l, r + 1): + arr[l], arr[i] = arr[i], arr[l] + generate_permutations(arr, l + 1, r, result) + arr[l], arr[i] = arr[i], arr[l] + +def get_permutations(arr): + result = [] + generate_permutations(arr, 0, len(arr) - 1, result) + return result + +if __name__ == "__main__": + arr = ['a', 'b', 'c'] + permutations = get_permutations(arr) + + for perm in permutations: + print(" ".join(map(str, perm))) diff --git a/RoadMap.md b/RoadMap.md index edbd2bc..2b16d2d 100644 --- a/RoadMap.md +++ b/RoadMap.md @@ -15,7 +15,7 @@ These are fundamental algorithms and functions often used in competitive program - [x] [Binary Search](Array_Functions/Binary_Search) - [x] [Upper bound](Array_Functions/Upper_Bound) - [x] [Lower bound (Binary Search)](Array_Functions/Lower_Bound_Binary_Search) -- [ ] Generate all Permutation (n!) +- [x] [Generate all Permutation (n!)](Array_Functions/Permutations) - [x] [Count occurrences of all elements](Array_Functions/Count_Occurence) ### 2. String Algorithms