Day 23 - LeetCode Hard
I am a passionate web developer and open-source enthusiast on a captivating journey of coding wonders. With a year of experience in web development, my curiosity led me to the enchanting world of React, where I found a true calling. Embracing the magic of collaboration and knowledge-sharing, I ventured into the realm of open source, contributing to Digital Public Goods (DPGs) for the betterment of the digital universe. A firm believer in learning in public, I share my insights and discoveries through blogging, inspiring fellow coders to embark on their own magical coding odysseys. Join me on this thrilling adventure, where imagination and technology converge, and together, let's shape the future of the digital landscape! 🎩✨
Screenshot:-

1. Median of Two Sorted Arrays
Problem: Given two sorted arrays, find the median of the two arrays combined.
Explanation: The median is the middle value of a sorted list. If the total number of elements is odd, it’s the middle element. If even, it’s the average of the two middle elements.
Script:
function findMedianSortedArrays(nums1, nums2) {
const merged = [...nums1, ...nums2].sort((a, b) => a - b);
const len = merged.length;
const mid = Math.floor(len / 2);
return len % 2 === 0 ? (merged[mid - 1] + merged[mid]) / 2 : merged[mid];
}
// Test cases
console.log(findMedianSortedArrays([1, 3], [2])); // Output: 2
console.log(findMedianSortedArrays([1, 2], [3, 4])); // Output: 2.5
2. Merge k Sorted Lists
Problem: Merge k sorted linked lists into one sorted linked list.
Explanation: Use a priority queue (min-heap) to efficiently merge k sorted linked lists.
Script:
class ListNode {
constructor(val = 0, next = null) {
this.val = val;
this.next = next;
}
}
function mergeKLists(lists) {
const heap = new MinHeap();
lists.forEach(list => {
while (list) {
heap.insert(list.val);
list = list.next;
}
});
let dummy = new ListNode(0);
let current = dummy;
while (!heap.isEmpty()) {
current.next = new ListNode(heap.extractMin());
current = current.next;
}
return dummy.next;
}
3. Trapping Rain Water
Problem: Compute how much water can be trapped after raining based on elevation map.
Explanation: Use two pointers to calculate the trapped water, considering the heights of the bars from both ends.
Script:
function trap(height) {
let left = 0, right = height.length - 1;
let leftMax = 0, rightMax = 0;
let water = 0;
while (left <= right) {
if (height[left] <= height[right]) {
leftMax = Math.max(leftMax, height[left]);
water += Math.max(0, leftMax - height[left]);
left++;
} else {
rightMax = Math.max(rightMax, height[right]);
water += Math.max(0, rightMax - height[right]);
right--;
}
}
return water;
}
// Test cases
console.log(trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1])); // Output: 6
4. N-Queens
Problem: Solve the N-Queens problem by placing n queens on an n x n chessboard so that no two queens attack each other.
Explanation: Use backtracking to place queens one by one and ensure they don’t threaten each other.
Script:
function solveNQueens(n) {
const result = [];
const board = Array(n).fill().map(() => Array(n).fill('.'));
function isSafe(row, col) {
for (let i = 0; i < row; i++) {
if (board[i][col] === 'Q') return false;
if (col - (row - i) >= 0 && board[i][col - (row - i)] === 'Q') return false;
if (col + (row - i) < n && board[i][col + (row - i)] === 'Q') return false;
}
return true;
}
function placeQueens(row) {
if (row === n) {
result.push(board.map(r => r.join('')));
return;
}
for (let col = 0; col < n; col++) {
if (isSafe(row, col)) {
board[row][col] = 'Q';
placeQueens(row + 1);
board[row][col] = '.';
}
}
}
placeQueens(0);
return result;
}
// Test cases
console.log(solveNQueens(4)); // Output: All distinct solutions for 4-Queens
5. Word Ladder
Problem: Find the shortest transformation sequence from a begin word to an end word using a dictionary.
Explanation: Use BFS to find the shortest path from the begin word to the end word by changing one letter at a time.
Script:
function ladderLength(beginWord, endWord, wordList) {
if (!wordList.includes(endWord)) return 0;
const wordSet = new Set(wordList);
const queue = [[beginWord, 1]];
while (queue.length) {
const [word, length] = queue.shift();
if (word === endWord) return length;
for (let i = 0; i < word.length; i++) {
for (let c = 'a'.charCodeAt(0); c <= 'z'.charCodeAt(0); c++) {
const newWord = word.slice(0, i) + String.fromCharCode(c) + word.slice(i + 1);
if (wordSet.has(newWord)) {
wordSet.delete(newWord);
queue.push([newWord, length + 1]);
}
}
}
}
return 0;
}
// Test cases
console.log(ladderLength("hit", "cog", ["hot", "dot", "dog", "cog"])); // Output: 5
Achievement
By working through these problems, you'll gain valuable experience in solving complex algorithmic challenges and handling edge cases. Each problem helps improve your problem-solving skills and understanding of advanced algorithms.
Happy Coding!!!!