class Solution {
public:
bool divideArray(vector<int>& nums) {
int ar[501];
for( int num:nums){
ar[num]++;
}
for( int element : ar ){
if( element%2 != 0) return false;
}
return true;
}
};
Category: c++
C++ Solution for LeetCode 2594. Minimum Time to Repair Cars
long long repairCars(vector<int>& ranks, int cars) {
//long long min_r = *min_element(ranks.begin(), ranks.end());
long long left = 1;
long long right = ranks[0] * (long long)cars * cars;
long long result = right; // Initialize with an upper bound
auto countRepairCars = [&ranks](long long time) {
long long repaired = 0;
for (int r : ranks) {
repaired += (long long)sqrt((double)time / r);
}
return repaired;
};
while (left <= right) {
long long midpoint = left + (right - left) / 2;
long long repaired = countRepairCars(midpoint);
if (repaired >= cars) {
result = midpoint; // Found a valid time, try to minimize it
right = midpoint - 1;
} else {
left = midpoint + 1;
}
}
return result;
}
Binary Search —- AGAIN!
int binarySearch(vector<int> &nums, int target) {
int low =0, high = nums.size()-1;
while( low <= high ){
int mid = low + (high - low) / 2;
if( nums[mid] == target )
return mid;
else if( nums[mid] < target )
low = mid + 1;
else
high = mid -1;
}
return -1;
}
1079. Letter Tile Possibilities
You have n
tiles
, where each tile has one letter tiles[i]
printed on it.
Return the number of possible non-empty sequences of letters you can make using the letters printed on those tiles
.
Example 1:
Input: tiles = "AAB" Output: 8 Explanation: The possible sequences are "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA".
Example 2:
Input: tiles = "AAABBC" Output: 188
Example 3:
Input: tiles = "V"
Output: 1
Depth First Search Solution, which is more performant with time complexity of O(N!) and space complexity of O(N).
class Solution {
public:
int numTilePossibilities(string tiles) {
unordered_map<char, int> count;
for (char c : tiles) {
count[c]++;
}
return dfs(count);
}
private:
int dfs(unordered_map<char, int>& count) {
int sum = 0;
for (auto& [tile, cnt] : count) {
if (cnt == 0) continue;
sum++;
count[tile]--;
sum += dfs(count);
count[tile]++;
}
return sum;
}
};
Backtracking Solution:
class Solution {
private:
set<string> seq;
void backtrack(const string& tiles, string& current, vector<bool>& used){
if( !current.empty() )
seq.insert( current );
for( int i =0; i<tiles.length();i++){
if(used[i]) continue;
used[i]=true;
current.push_back(tiles[i]);
backtrack(tiles, current, used);
current.pop_back();
used[i]=false;
}
}
public:
int numTilePossibilities(string tiles) {
vector<bool> used(tiles.length(), false);
string current = "";
backtrack(tiles, current, used);
return seq.size();
}
};
Optimized Backtracking solution:
class Solution {
public:
void backtrack(unordered_map<char,int>&mapi,int &count){
for(auto&entry:mapi){
if(entry.second>0){
entry.second--;
count++;
backtrack(mapi,count);
entry.second++;
}
}
}
int numTilePossibilities(string tiles) {
unordered_map<char,int>mapi;
for(int i=0;i<tiles.size();i++){
mapi[tiles[i]]++;
}
int count=0;
backtrack(mapi,count);
return count;
}
};
3174. Clear Digits
You are given a string s
. Your task is to remove all digits by doing this operation repeatedly: Delete the first digit and the closest non-digit character to its left. Return the resulting string after removing all digits.
Example 1:
Input: s = “abc”
Output: “abc”
Explanation:
There is no digit in the string.
Example 2:
Input: s = “cb34”
Output: “”
Explanation:
First, we apply the operation on s[2]
, and s
becomes "c4"
.
Then we apply the operation on s[1]
, and s
becomes ""
.
Constraints:
1 <= s.length <= 100
s
consists only of lowercase English letters and digits.- The input is generated such that it is possible to delete all digits.
string clearDigits(string s) {
stack<char> sc;
string result = "";
for( char c : s ){
if( c >= 48 && c <=57 ){
sc.pop();
} else
sc.push(c);
}
while( !sc.empty() ){
result+= sc.top();
sc.pop();
}
reverse( result.begin(), result.end());
return result;
}
Tuple with Same Product
Given an array nums
of distinct positive integers, return the number of tuples (a, b, c, d)
such that a * b = c * d
where a
, b
, c
, and d
are elements of nums
, and a != b != c != d
.
Example 1:
Input: nums = [2,3,4,6] Output: 8 Explanation: There are 8 valid tuples: (2,6,3,4) , (2,6,4,3) , (6,2,3,4) , (6,2,4,3) (3,4,2,6) , (4,3,2,6) , (3,4,6,2) , (4,3,6,2)
Example 2:
Input: nums = [1,2,4,5,10] Output: 16 Explanation: There are 16 valid tuples: (1,10,2,5) , (1,10,5,2) , (10,1,2,5) , (10,1,5,2) (2,5,1,10) , (2,5,10,1) , (5,2,1,10) , (5,2,10,1) (2,10,4,5) , (2,10,5,4) , (10,2,4,5) , (10,2,5,4) (4,5,2,10) , (4,5,10,2) , (5,4,2,10) , (5,4,10,2)
Constraints:
1 <= nums.length <= 1000
1 <= nums[i] <= 10<sup>4</sup>
- All elements in
nums
are distinct.
class Solution {
public:
int tupleSameProduct(vector<int>& nums) {
uint size = nums.size();
unordered_map<int, int> mp;
for( int i = 0; i < size; i++ )
for( int j = i +1; j< size; j++){
int prod = nums[i] * nums[j];
mp[prod]++;
}
int res = 0;
for( auto& [prod, cnt] : mp ){
int pairs = (cnt *(cnt-1)) / 2;
res += 8 * pairs;
}
return res;
}
};
2270. Number of Ways to Split Array
class Solution {
public:
int waysToSplitArray(vector<int>& nums) {
// Keep track of sum of elements on left and right sides
long long leftSum = 0, rightSum = 0;
// Initially all elements are on right side
for (int num : nums) {
rightSum += num;
}
int count = 0;
// Try each possible split position
for (int i = 0; i < nums.size() - 1; i++) {
// Move current element from right to left side
leftSum += nums[i];
rightSum -= nums[i];
// Check if this creates a valid split
if (leftSum >= rightSum) {
count++;
}
}
return count;
}
};
You are given a 0-indexed integer array nums
of length n
.
nums
contains a valid split at index i
if the following are true:
- The sum of the first
i + 1
elements is greater than or equal to the sum of the lastn - i - 1
elements. - There is at least one element to the right of
i
. That is,0 <= i < n - 1
.
Return the number of valid splits in nums
.
Example 1:
Input: nums = [10,4,-8,7] Output: 2 Explanation: There are three ways of splitting nums into two non-empty parts: - Split nums at index 0. Then, the first part is [10], and its sum is 10. The second part is [4,-8,7], and its sum is 3. Since 10 >= 3, i = 0 is a valid split. - Split nums at index 1. Then, the first part is [10,4], and its sum is 14. The second part is [-8,7], and its sum is -1. Since 14 >= -1, i = 1 is a valid split. - Split nums at index 2. Then, the first part is [10,4,-8], and its sum is 6. The second part is [7], and its sum is 7. Since 6 < 7, i = 2 is not a valid split. Thus, the number of valid splits in nums is 2.
Example 2:
Input: nums = [2,3,1,0] Output: 2 Explanation: There are two valid splits in nums: - Split nums at index 1. Then, the first part is [2,3], and its sum is 5. The second part is [1,0], and its sum is 1. Since 5 >= 1, i = 1 is a valid split. - Split nums at index 2. Then, the first part is [2,3,1], and its sum is 6. The second part is [0], and its sum is 0. Since 6 >= 0, i = 2 is a valid split.
Constraints:
2 <= nums.length <= 10<sup>5</sup>
-10<sup>5</sup> <= nums[i] <= 10<sup>5</sup>
Subarrays with sum K
Given an unsorted array of integers, find the number of continuous subarrays having sum exactly equal to a given number k.
Examples:
Input: arr = [10, 2, -2, -20, 10], k = -10 Output: 3 Explaination: Subarrays: arr[0...3], arr[1...4], arr[3...4] have sum exactly equal to -10.
Input: arr = [9, 4, 20, 3, 10, 5], k = 33 Output: 2 Explaination: Subarrays: arr[0...2], arr[2...4] have sum exactly equal to 33.
Input: arr = [1, 3, 5], k = 0
Output: 0 Explaination: No subarray with 0 sum.
Constraints:
- 1 ≤ arr.size() ≤ 105
- -103 ≤ arr[i] ≤ 103
- -107 ≤ k ≤ 107
class Solution {
public:
int countSubarrays(vector<int> &arr, int k) {
// unordered_map to store prefix sums frequencies
unordered_map<int, int> prefixSums;
int res = 0;
int currSum = 0;
for (int i = 0; i < arr.size(); i++) {
// Add current element to sum so far.
currSum += arr[i];
// If currSum is equal to desired sum, then a new
// subarray is found. So increase count of subarrays.
if (currSum == k)
res++;
// Check if the difference exists in the prefixSums map.
if (prefixSums.find(currSum - k) != prefixSums.end())
res += prefixSums[currSum - k];
// Add currSum to the set of prefix sums.
prefixSums[currSum]++;
}
return res;
}
};
1678. Goal Parser Interpretation
You own a Goal Parser that can interpret a string command
. The command
consists of an alphabet of "G"
, "()"
and/or "(al)"
in some order. The Goal Parser will interpret "G"
as the string "G"
, "()"
as the string "o"
, and "(al)"
as the string "al"
. The interpreted strings are then concatenated in the original order.
Given the string command
, return the Goal Parser‘s interpretation of command
.
Example 1:
Input: command = "G()(al)" Output: "Goal" Explanation: The Goal Parser interprets the command as follows: G -> G () -> o (al) -> al The final concatenated result is "Goal".
Example 2:
Input: command = "G()()()()(al)" Output: "Gooooal"
Example 3:
Input: command = "(al)G(al)()()G" Output: "alGalooG"
class Solution {
public:
string interpret(string command) {
string result = "";
for(int i=0; i<command.size(); i++){
if(command[i] == 'G') result += "G";
else if(command[i] == '(' && command[i+1] == ')') {
result += "o";
i++;
}
else if(command[i] == '(' && command.substr(i,4) == "(al)"){
result += "al";
i += 3;
}
}
return result;
}
};
2559. Count Vowel Strings in Ranges
You are given a 0-indexed array of strings words
and a 2D array of integers queries
.
Each query queries[i] = [l<sub>i</sub>, r<sub>i</sub>]
asks us to find the number of strings present in the range l<sub>i</sub>
to r<sub>i</sub>
(both inclusive) of words
that start and end with a vowel.
Return an array ans
of size queries.length
, where ans[i]
is the answer to the i
th query.
Note that the vowel letters are 'a'
, 'e'
, 'i'
, 'o'
, and 'u'
.
Example 1:
Input: words = ["aba","bcb","ece","aa","e"], queries = [[0,2],[1,4],[1,1]] Output: [2,3,0] Explanation: The strings starting and ending with a vowel are "aba", "ece", "aa" and "e". The answer to the query [0,2] is 2 (strings "aba" and "ece"). to query [1,4] is 3 (strings "ece", "aa", "e"). to query [1,1] is 0. We return [2,3,0].
Example 2:
Input: words = ["a","e","i"], queries = [[0,2],[0,1],[2,2]] Output: [3,2,1] Explanation: Every string satisfies the conditions, so we return [3,2,1].
class Solution {
public:
vector<int> vowelStrings(vector<string>& words, vector<vector<int>>& queries) {
vector<int> prefixSum(words.size()+1,0);
vector<int> result;
function<bool(char)> isVowel = [](char ch)->bool{
if( ch == 'a' || ch == 'e' || ch =='i' || ch == 'o' || ch=='u'){
return true;
}
return false;
};
int index = 1;
for( string str:words){
if( isVowel(str.front()) && isVowel(str.back()) ){
prefixSum[index] = prefixSum[index-1]+1;
} else
prefixSum[index] = prefixSum[index-1];
index++;
}
for( auto q: queries ){
result.push_back( prefixSum[q[1]+1] - prefixSum[q[0]] );
}
return result;
}
};