Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions LeetCode/Algorithms/CountSubsetsWithSumK.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
int mod = (int)(1e9 + 7);
int f(vector<int> &arr, int ind, int sum, vector<vector<int>> &dp) {
// if(sum == 0) return 1;
if(ind == 0) {
if(sum == 0 && arr[0] == 0) return 2; // 0 0 1 2 3, target = 5 - to handle case where multiple 0's
if(sum == 0) return 1; //
return arr[0] == sum;
// if(sum == 0 || sum == arr[0]) return 1;
// return 0;
}
if(dp[ind][sum] != -1) return dp[ind][sum];
// not take
int notTake = f(arr, ind - 1, sum, dp);

// take
int take = 0;
if(sum >= arr[ind]) {
take = f(arr, ind -1, sum - arr[ind], dp);
}

return dp[ind][sum] = (take + notTake) % mod;
}

int findWays(vector<int>& arr, int k)
{
// Write your code here.
int n = arr.size();
vector<vector<int>> dp(n, vector<int>(k + 1, -1));
return f(arr, n-1, k, dp);
}


78 changes: 78 additions & 0 deletions LeetCode/Algorithms/DisjoinSet.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#include <bits/stdc++.h>
using namespace std;
class DisjoinSet {
vector<int> rank, parent, size;

public:
DisjoinSet(int n) {
rank.resize(n + 1, 0);
size.resize(n + 1, 0);
parent.resize(n + 1);
for(int i=0; i<=n; i++) {
parent[i] = i;
size[i] = 1;
}
}

int findUPar(int node) {
if(node == parent[node]) {
return node;
}
return parent[node] = findUPar(parent[node]);
}

void UnionByRank(int u, int v) {
int ulp_u = findUPar(u);
int ulp_v = findUPar(v);

if(ulp_u == ulp_v) {
return;
} else if(rank[ulp_v] > rank[ulp_u]) {
parent[ulp_u] = ulp_v;
} else if(rank[ulp_u] > rank[ulp_v]) {
parent[ulp_v] = ulp_u;
} else if(rank[ulp_u] == rank[ulp_v]) {
parent[ulp_v] = ulp_u;
rank[ulp_v]++;
}
}

void UnionBySize(int u, int v) {
int ulp_u = parent[u];
int ulp_v = parent[v];

if(ulp_u == ulp_v) return;
if(size[ulp_u] > size[ulp_v]) {
size[ulp_u] += size[ulp_v];
parent[ulp_v] = ulp_u;
} else {
size[ulp_v] += size[ulp_u];
parent[ulp_u] = ulp_v;
}
}
};

int main() {
DisjoinSet ds(7);
ds.UnionByRank(1, 2);
ds.UnionByRank(2, 3);
ds.UnionByRank(4, 5);
ds.UnionByRank(6, 7);
ds.UnionByRank(5, 6);
// ds.UnionByRank(1, 2);

// if 3 and 7 same or not
if(ds.findUPar(3) == ds.findUPar(7)) {
cout<<"Same"<<endl;
} else {
cout<<"Not Same"<<endl;
}
ds.UnionByRank(3, 7);
if(ds.findUPar(3) == ds.findUPar(7)) {
cout<<"Same"<<endl;
} else {
cout<<"Not Same"<<endl;
}

return 0;
}
66 changes: 66 additions & 0 deletions LeetCode/Algorithms/Hard/CountSubarraysWithScoreLessThanK.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#define ll long long
class Solution {
public:
long long countSubarrays(vector<int>& nums, long long k) {
ll left = 0, right = 0; // window is [left, right)
ll sum = 0; // sum of nums[left ... right -1]
ll count = 0;

ll n = nums.size();

while(left < n) {
// find larget valid window
while(right < n && (sum + nums[right] * (right - left + 1) < k)) {
sum += nums[right];
right++;
}

// All subarrays starting at 'left' and ending before 'right' are valid
count += right - left;

// Slide the window forward by removing nums[left]
// If we couldn't even include nums[left], move both pointer past it
if(left == right) {
right++;
} else {
sum -= nums[left];
}

left++;
}

return count;
}
};

/*

Time Complexity - O(N)
Space Complexity - O(1)

Counting Logic
0 1 2 3 4 5
a[]: [2, 1, 1, 3, 4, 1], k = 15
| |
start end

1. Increase end till sum * len < k
2. Count = end - start
3. Increase start pointer and again when sum * len >= k,
calculate count and increment start++ pointer

[start, End) => largest subarray starting at '0' which has (sum * size) < k

start, end - 1 ie 4 * 3 < 15

Count of such Subarrays start at '0' = 3

in general [start, start], [start, start+ 1], ... [start, end-1]

count = end - start

// Two Pointer + Sliding Window



*/