You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Two Sum - найти два числа с заданной суммойfunctiontwoSum(nums,target){constmap=newMap();// число -> индексfor(leti=0;i<nums.length;i++){constcomplement=target-nums[i];if(map.has(complement)){return[map.get(complement),i];}map.set(nums[i],i);}return[];}// Проверка на дубликатыfunctioncontainsDuplicate(nums){returnnewSet(nums).size!==nums.length;}
Prefix Sum (префиксные суммы)
// Range Sum Query - сумма элементов в диапазоне [i, j]classPrefixSum{constructor(nums){this.prefix=[0];for(letnumofnums){this.prefix.push(this.prefix[this.prefix.length-1]+num);}}sumRange(left,right){returnthis.prefix[right+1]-this.prefix[left];}}// Subarray Sum Equals KfunctionsubarraySum(nums,k){constmap=newMap([[0,1]]);// prefixSum -> countletsum=0,count=0;for(letnumofnums){sum+=num;if(map.has(sum-k))count+=map.get(sum-k);map.set(sum,(map.get(sum)||0)+1);}returncount;}
Counting/Frequency Map
// Valid AnagramfunctionisAnagram(s,t){if(s.length!==t.length)returnfalse;constcount={};for(letcharofs)count[char]=(count[char]||0)+1;for(letcharoft){if(!count[char])returnfalse;count[char]--;}returntrue;}// Top K Frequent ElementsfunctiontopKFrequent(nums,k){constfreq=newMap();for(letnumofnums){freq.set(num,(freq.get(num)||0)+1);}return[...freq.entries()].sort((a,b)=>b[1]-a[1]).slice(0,k).map(x=>x[0]);}
2. Two Pointers (Два указателя)
Встречные указатели (left/right)
// Valid PalindromefunctionisPalindrome(s){s=s.toLowerCase().replace(/[^a-z0-9]/g,'');letleft=0,right=s.length-1;while(left<right){if(s[left]!==s[right])returnfalse;left++;right--;}returntrue;}// Two Sum II - отсортированный массивfunctiontwoSumSorted(numbers,target){letleft=0,right=numbers.length-1;while(left<right){constsum=numbers[left]+numbers[right];if(sum===target)return[left+1,right+1];if(sum<target)left++;elseright--;}return[];}// Container With Most WaterfunctionmaxArea(height){letleft=0,right=height.length-1,maxArea=0;while(left<right){constarea=Math.min(height[left],height[right])*(right-left);maxArea=Math.max(maxArea,area);if(height[left]<height[right])left++;elseright--;}returnmaxArea;}
Быстрый и медленный указатель
// Remove Duplicates from Sorted ArrayfunctionremoveDuplicates(nums){letslow=0;for(letfast=1;fast<nums.length;fast++){if(nums[fast]!==nums[slow]){slow++;nums[slow]=nums[fast];}}returnslow+1;}// Move ZeroesfunctionmoveZeroes(nums){letslow=0;for(letfast=0;fast<nums.length;fast++){if(nums[fast]!==0){[nums[slow],nums[fast]]=[nums[fast],nums[slow]];slow++;}}}
// Maximum Average Subarray I (размер k)functionfindMaxAverage(nums,k){letsum=0;for(leti=0;i<k;i++)sum+=nums[i];letmaxSum=sum;for(leti=k;i<nums.length;i++){sum+=nums[i]-nums[i-k];maxSum=Math.max(maxSum,sum);}returnmaxSum/k;}
// Next Greater Element IfunctionnextGreaterElement(nums1,nums2){constmap=newMap();conststack=[];for(letnumofnums2){while(stack.length&&stack[stack.length-1]<num){map.set(stack.pop(),num);}stack.push(num);}returnnums1.map(num=>map.get(num)||-1);}// Daily TemperaturesfunctiondailyTemperatures(temperatures){constresult=newArray(temperatures.length).fill(0);conststack=[];// индексыfor(leti=0;i<temperatures.length;i++){while(stack.length&&temperatures[i]>temperatures[stack[stack.length-1]]){constidx=stack.pop();result[idx]=i-idx;}stack.push(i);}returnresult;}
// Koko Eating BananasfunctionminEatingSpeed(piles,h){letleft=1,right=Math.max(...piles);constcanFinish=(speed)=>{lethours=0;for(letpileofpiles){hours+=Math.ceil(pile/speed);}returnhours<=h;};while(left<right){constmid=Math.floor((left+right)/2);if(canFinish(mid))right=mid;elseleft=mid+1;}returnleft;}
Rotated sorted array
// Search in Rotated Sorted ArrayfunctionsearchRotated(nums,target){letleft=0,right=nums.length-1;while(left<=right){constmid=Math.floor((left+right)/2);if(nums[mid]===target)returnmid;// Левая часть отсортированаif(nums[left]<=nums[mid]){if(nums[left]<=target&&target<nums[mid]){right=mid-1;}else{left=mid+1;}}// Правая часть отсортированаelse{if(nums[mid]<target&&target<=nums[right]){left=mid+1;}else{right=mid-1;}}}return-1;}
6. Linked List
// Определение ListNodeclassListNode{constructor(val=0,next=null){this.val=val;this.next=next;}}
Fast & Slow Pointers (Floyd's Cycle)
// Linked List CyclefunctionhasCycle(head){letslow=head,fast=head;while(fast&&fast.next){slow=slow.next;fast=fast.next.next;if(slow===fast)returntrue;}returnfalse;}// Middle of Linked ListfunctionmiddleNode(head){letslow=head,fast=head;while(fast&&fast.next){slow=slow.next;fast=fast.next.next;}returnslow;}
Reverse linked list
// Reverse Linked List (итеративно)functionreverseList(head){letprev=null,curr=head;while(curr){constnext=curr.next;curr.next=prev;prev=curr;curr=next;}returnprev;}// Reverse Linked List (рекурсивно)functionreverseListRecursive(head){if(!head||!head.next)returnhead;constnewHead=reverseListRecursive(head.next);head.next.next=head;head.next=null;returnnewHead;}
Merge lists
// Merge Two Sorted ListsfunctionmergeTwoLists(l1,l2){constdummy=newListNode(0);letcurr=dummy;while(l1&&l2){if(l1.val<l2.val){curr.next=l1;l1=l1.next;}else{curr.next=l2;l2=l2.next;}curr=curr.next;}curr.next=l1||l2;returndummy.next;}// Remove Nth Node From EndfunctionremoveNthFromEnd(head,n){constdummy=newListNode(0,head);letfast=dummy,slow=dummy;for(leti=0;i<=n;i++)fast=fast.next;while(fast){fast=fast.next;slow=slow.next;}slow.next=slow.next.next;returndummy.next;}
7. Trees
// Определение TreeNodeclassTreeNode{constructor(val=0,left=null,right=null){this.val=val;this.left=left;this.right=right;}}
DFS (in/pre/post-order)
// Inorder (левый -> корень -> правый)functioninorderTraversal(root){constresult=[];functiondfs(node){if(!node)return;dfs(node.left);result.push(node.val);dfs(node.right);}dfs(root);returnresult;}// Preorder (корень -> левый -> правый)functionpreorderTraversal(root){constresult=[];functiondfs(node){if(!node)return;result.push(node.val);dfs(node.left);dfs(node.right);}dfs(root);returnresult;}// Postorder (левый -> правый -> корень)functionpostorderTraversal(root){constresult=[];functiondfs(node){if(!node)return;dfs(node.left);dfs(node.right);result.push(node.val);}dfs(root);returnresult;}// Maximum DepthfunctionmaxDepth(root){if(!root)return0;return1+Math.max(maxDepth(root.left),maxDepth(root.right));}// Diameter of Binary TreefunctiondiameterOfBinaryTree(root){letdiameter=0;functionheight(node){if(!node)return0;constleft=height(node.left);constright=height(node.right);diameter=Math.max(diameter,left+right);return1+Math.max(left,right);}height(root);returndiameter;}
BFS (level-order)
// Level Order TraversalfunctionlevelOrder(root){if(!root)return[];constresult=[];constqueue=[root];while(queue.length){constlevelSize=queue.length;constlevel=[];for(leti=0;i<levelSize;i++){constnode=queue.shift();level.push(node.val);if(node.left)queue.push(node.left);if(node.right)queue.push(node.right);}result.push(level);}returnresult;}// Right Side ViewfunctionrightSideView(root){if(!root)return[];constresult=[];constqueue=[root];while(queue.length){constlevelSize=queue.length;for(leti=0;i<levelSize;i++){constnode=queue.shift();if(i===levelSize-1)result.push(node.val);if(node.left)queue.push(node.left);if(node.right)queue.push(node.right);}}returnresult;}
Binary Search Tree операции
// Validate BSTfunctionisValidBST(root){functionvalidate(node,min,max){if(!node)returntrue;if(node.val<=min||node.val>=max)returnfalse;returnvalidate(node.left,min,node.val)&&validate(node.right,node.val,max);}returnvalidate(root,-Infinity,Infinity);}// Insert into BSTfunctioninsertIntoBST(root,val){if(!root)returnnewTreeNode(val);if(val<root.val)root.left=insertIntoBST(root.left,val);elseroot.right=insertIntoBST(root.right,val);returnroot;}
Lowest Common Ancestor
// LCA of Binary TreefunctionlowestCommonAncestor(root,p,q){if(!root||root===p||root===q)returnroot;constleft=lowestCommonAncestor(root.left,p,q);constright=lowestCommonAncestor(root.right,p,q);if(left&&right)returnroot;returnleft||right;}
// DFS (рекурсивный)functiondfsRecursive(graph,start,visited=newSet()){visited.add(start);console.log(start);for(letneighborofgraph[start]){if(!visited.has(neighbor)){dfsRecursive(graph,neighbor,visited);}}}// DFS (итеративный со стеком)functiondfsIterative(graph,start){constvisited=newSet();conststack=[start];while(stack.length){constnode=stack.pop();if(visited.has(node))continue;visited.add(node);console.log(node);for(letneighborofgraph[node]){if(!visited.has(neighbor)){stack.push(neighbor);}}}}// BFS (с очередью)functionbfs(graph,start){constvisited=newSet([start]);constqueue=[start];while(queue.length){constnode=queue.shift();console.log(node);for(letneighborofgraph[node]){if(!visited.has(neighbor)){visited.add(neighbor);queue.push(neighbor);}}}}// Number of Islands (DFS)functionnumIslands(grid){letcount=0;functiondfs(i,j){if(i<0||i>=grid.length||j<0||j>=grid[0].length||grid[i][j]==='0')return;grid[i][j]='0';dfs(i+1,j);dfs(i-1,j);dfs(i,j+1);dfs(i,j-1);}for(leti=0;i<grid.length;i++){for(letj=0;j<grid[0].length;j++){if(grid[i][j]==='1'){count++;dfs(i,j);}}}returncount;}
classUnionFind{constructor(n){this.parent=Array.from({length: n},(_,i)=>i);this.rank=newArray(n).fill(1);}find(x){if(this.parent[x]!==x){this.parent[x]=this.find(this.parent[x]);// path compression}returnthis.parent[x];}union(x,y){constrootX=this.find(x);constrootY=this.find(y);if(rootX===rootY)returnfalse;// Union by rankif(this.rank[rootX]>this.rank[rootY]){this.parent[rootY]=rootX;}elseif(this.rank[rootX]<this.rank[rootY]){this.parent[rootX]=rootY;}else{this.parent[rootY]=rootX;this.rank[rootX]++;}returntrue;}}// Number of Connected ComponentsfunctioncountComponents(n,edges){constuf=newUnionFind(n);for(let[u,v]ofedges){uf.union(u,v);}returnnewSet(Array.from({length: n},(_,i)=>uf.find(i))).size;}
Detect cycle
// Detect Cycle in Undirected Graph (Union Find)functionhasCycleUndirected(n,edges){constuf=newUnionFind(n);for(let[u,v]ofedges){if(!uf.union(u,v))returntrue;// уже в одном компоненте}returnfalse;}// Detect Cycle in Directed Graph (DFS)functionhasCycleDirected(numCourses,prerequisites){constgraph=Array.from({length: numCourses},()=>[]);for(let[course,prereq]ofprerequisites){graph[prereq].push(course);}constvisiting=newSet();constvisited=newSet();functiondfs(node){if(visiting.has(node))returntrue;// cycle detectedif(visited.has(node))returnfalse;visiting.add(node);for(letneighborofgraph[node]){if(dfs(neighbor))returntrue;}visiting.delete(node);visited.add(node);returnfalse;}for(leti=0;i<numCourses;i++){if(dfs(i))returntrue;}returnfalse;}
9. Dynamic Programming
1D DP (Fibonacci-like)
// Fibonaccifunctionfib(n){if(n<=1)returnn;letprev2=0,prev1=1;for(leti=2;i<=n;i++){constcurr=prev1+prev2;prev2=prev1;prev1=curr;}returnprev1;}// Climbing StairsfunctionclimbStairs(n){if(n<=2)returnn;letprev2=1,prev1=2;for(leti=3;i<=n;i++){constcurr=prev1+prev2;prev2=prev1;prev1=curr;}returnprev1;}// House Robberfunctionrob(nums){if(nums.length===0)return0;if(nums.length===1)returnnums[0];letprev2=0,prev1=0;for(letnumofnums){constcurr=Math.max(prev1,prev2+num);prev2=prev1;prev1=curr;}returnprev1;}
// 0/1 Knapsackfunctionknapsack01(weights,values,capacity){constn=weights.length;constdp=Array(n+1).fill(0).map(()=>Array(capacity+1).fill(0));for(leti=1;i<=n;i++){for(letw=0;w<=capacity;w++){if(weights[i-1]<=w){dp[i][w]=Math.max(dp[i-1][w],dp[i-1][w-weights[i-1]]+values[i-1]);}else{dp[i][w]=dp[i-1][w];}}}returndp[n][capacity];}// Unbounded Knapsack (можно брать элементы несколько раз)functionknapsackUnbounded(weights,values,capacity){constdp=newArray(capacity+1).fill(0);for(letw=0;w<=capacity;w++){for(leti=0;i<weights.length;i++){if(weights[i]<=w){dp[w]=Math.max(dp[w],dp[w-weights[i]]+values[i]);}}}returndp[capacity];}// Coin Change (минимум монет)functioncoinChange(coins,amount){constdp=newArray(amount+1).fill(Infinity);dp[0]=0;for(leti=1;i<=amount;i++){for(letcoinofcoins){if(coin<=i){dp[i]=Math.min(dp[i],dp[i-coin]+1);}}}returndp[amount]===Infinity ? -1 : dp[amount];}
LCS/LIS (longest common/increasing subsequence)
// Longest Common SubsequencefunctionlongestCommonSubsequence(text1,text2){constm=text1.length,n=text2.length;constdp=Array(m+1).fill(0).map(()=>Array(n+1).fill(0));for(leti=1;i<=m;i++){for(letj=1;j<=n;j++){if(text1[i-1]===text2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);}}}returndp[m][n];}// Longest Increasing Subsequence (O(n^2))functionlengthOfLIS(nums){constdp=newArray(nums.length).fill(1);for(leti=1;i<nums.length;i++){for(letj=0;j<i;j++){if(nums[j]<nums[i]){dp[i]=Math.max(dp[i],dp[j]+1);}}}returnMath.max(...dp);}// LIS (O(n log n) с binary search)functionlengthOfLISOptimized(nums){consttails=[];for(letnumofnums){letleft=0,right=tails.length;while(left<right){constmid=Math.floor((left+right)/2);if(tails[mid]<num)left=mid+1;elseright=mid;}if(left===tails.length)tails.push(num);elsetails[left]=num;}returntails.length;}
Kadane's Algorithm
// Maximum Subarray SumfunctionmaxSubArray(nums){letmaxSum=nums[0],currSum=nums[0];for(leti=1;i<nums.length;i++){currSum=Math.max(nums[i],currSum+nums[i]);maxSum=Math.max(maxSum,currSum);}returnmaxSum;}// Maximum Product SubarrayfunctionmaxProduct(nums){letmaxProd=nums[0],minProd=nums[0],result=nums[0];for(leti=1;i<nums.length;i++){if(nums[i]<0){[maxProd,minProd]=[minProd,maxProd];}maxProd=Math.max(nums[i],maxProd*nums[i]);minProd=Math.min(nums[i],minProd*nums[i]);result=Math.max(result,maxProd);}returnresult;}
10. Backtracking
Combinations
// Combinations (выбрать k элементов из n)functioncombine(n,k){constresult=[];functionbacktrack(start,path){if(path.length===k){result.push([...path]);return;}for(leti=start;i<=n;i++){path.push(i);backtrack(i+1,path);path.pop();}}backtrack(1,[]);returnresult;}// Combination Sum (с повторениями)functioncombinationSum(candidates,target){constresult=[];functionbacktrack(start,path,sum){if(sum===target){result.push([...path]);return;}if(sum>target)return;for(leti=start;i<candidates.length;i++){path.push(candidates[i]);backtrack(i,path,sum+candidates[i]);// i, не i+1 (можно повторять)path.pop();}}backtrack(0,[],0);returnresult;}
Permutations
// Permutations (все перестановки)functionpermute(nums){constresult=[];functionbacktrack(path,used){if(path.length===nums.length){result.push([...path]);return;}for(leti=0;i<nums.length;i++){if(used[i])continue;path.push(nums[i]);used[i]=true;backtrack(path,used);path.pop();used[i]=false;}}backtrack([],newArray(nums.length).fill(false));returnresult;}// Permutations II (с дубликатами)functionpermuteUnique(nums){nums.sort((a,b)=>a-b);constresult=[];functionbacktrack(path,used){if(path.length===nums.length){result.push([...path]);return;}for(leti=0;i<nums.length;i++){if(used[i])continue;if(i>0&&nums[i]===nums[i-1]&&!used[i-1])continue;path.push(nums[i]);used[i]=true;backtrack(path,used);path.pop();used[i]=false;}}backtrack([],newArray(nums.length).fill(false));returnresult;}
Subsets
// Subsets (все подмножества)functionsubsets(nums){constresult=[];functionbacktrack(start,path){result.push([...path]);for(leti=start;i<nums.length;i++){path.push(nums[i]);backtrack(i+1,path);path.pop();}}backtrack(0,[]);returnresult;}// Subsets II (с дубликатами)functionsubsetsWithDup(nums){nums.sort((a,b)=>a-b);constresult=[];functionbacktrack(start,path){result.push([...path]);for(leti=start;i<nums.length;i++){if(i>start&&nums[i]===nums[i-1])continue;path.push(nums[i]);backtrack(i+1,path);path.pop();}}backtrack(0,[]);returnresult;}
N-Queens pattern
// N-QueensfunctionsolveNQueens(n){constresult=[];constboard=Array(n).fill(0).map(()=>Array(n).fill('.'));constcols=newSet();constdiag1=newSet();// row - colconstdiag2=newSet();// row + colfunctionbacktrack(row){if(row===n){result.push(board.map(r=>r.join('')));return;}for(letcol=0;col<n;col++){if(cols.has(col)||diag1.has(row-col)||diag2.has(row+col)){continue;}board[row][col]='Q';cols.add(col);diag1.add(row-col);diag2.add(row+col);backtrack(row+1);board[row][col]='.';cols.delete(col);diag1.delete(row-col);diag2.delete(row+col);}}backtrack(0);returnresult;}// Word SearchfunctionwordSearch(board,word){constm=board.length,n=board[0].length;functionbacktrack(i,j,k){if(k===word.length)returntrue;if(i<0||i>=m||j<0||j>=n||board[i][j]!==word[k]){returnfalse;}consttemp=board[i][j];board[i][j]='#';// mark visitedconstfound=backtrack(i+1,j,k+1)||backtrack(i-1,j,k+1)||backtrack(i,j+1,k+1)||backtrack(i,j-1,k+1);board[i][j]=temp;// restorereturnfound;}for(leti=0;i<m;i++){for(letj=0;j<n;j++){if(backtrack(i,j,0))returntrue;}}returnfalse;}
11. Greedy
Intervals (merge, schedule)
// Merge Intervalsfunctionmerge(intervals){intervals.sort((a,b)=>a[0]-b[0]);constresult=[intervals[0]];for(leti=1;i<intervals.length;i++){constlast=result[result.length-1];if(intervals[i][0]<=last[1]){last[1]=Math.max(last[1],intervals[i][1]);}else{result.push(intervals[i]);}}returnresult;}// Insert Intervalfunctioninsert(intervals,newInterval){constresult=[];leti=0;// Add all intervals before newIntervalwhile(i<intervals.length&&intervals[i][1]<newInterval[0]){result.push(intervals[i]);i++;}// Merge overlapping intervalswhile(i<intervals.length&&intervals[i][0]<=newInterval[1]){newInterval[0]=Math.min(newInterval[0],intervals[i][0]);newInterval[1]=Math.max(newInterval[1],intervals[i][1]);i++;}result.push(newInterval);// Add remaining intervalswhile(i<intervals.length){result.push(intervals[i]);i++;}returnresult;}// Non-overlapping Intervals (минимум удалений)functioneraseOverlapIntervals(intervals){intervals.sort((a,b)=>a[1]-b[1]);// sort by end timeletend=intervals[0][1];letcount=0;for(leti=1;i<intervals.length;i++){if(intervals[i][0]<end){count++;// overlap, remove this interval}else{end=intervals[i][1];}}returncount;}// Meeting Rooms II (минимум комнат)functionminMeetingRooms(intervals){conststarts=intervals.map(x=>x[0]).sort((a,b)=>a-b);constends=intervals.map(x=>x[1]).sort((a,b)=>a-b);letrooms=0,endPtr=0;for(leti=0;i<starts.length;i++){if(starts[i]<ends[endPtr]){rooms++;}else{endPtr++;}}returnrooms;}
Jump Game pattern
// Jump GamefunctioncanJump(nums){letmaxReach=0;for(leti=0;i<nums.length;i++){if(i>maxReach)returnfalse;maxReach=Math.max(maxReach,i+nums[i]);}returntrue;}// Jump Game II (минимум прыжков)functionjump(nums){letjumps=0,currEnd=0,maxReach=0;for(leti=0;i<nums.length-1;i++){maxReach=Math.max(maxReach,i+nums[i]);if(i===currEnd){jumps++;currEnd=maxReach;}}returnjumps;}
// Kth Largest ElementfunctionfindKthLargest(nums,k){constminHeap=newMinHeap();for(letnumofnums){minHeap.push(num);if(minHeap.size()>k){minHeap.pop();}}returnminHeap.peek();}// Top K Frequent ElementsfunctiontopKFrequent(nums,k){constfreq=newMap();for(letnumofnums){freq.set(num,(freq.get(num)||0)+1);}// Bucket sort approachconstbuckets=Array(nums.length+1).fill(0).map(()=>[]);for(let[num,count]offreq){buckets[count].push(num);}constresult=[];for(leti=buckets.length-1;i>=0&&result.length<k;i--){result.push(...buckets[i]);}returnresult.slice(0,k);}
Merge K sorted
// Merge K Sorted ListsfunctionmergeKLists(lists){constminHeap=newMinHeap();minHeap.heap=lists.filter(l=>l).sort((a,b)=>a.val-b.val);constdummy=newListNode(0);letcurr=dummy;while(minHeap.size()>0){constnode=minHeap.pop();curr.next=node;curr=curr.next;if(node.next){minHeap.push(node.next);}}returndummy.next;}
Meeting Rooms
// Meeting Rooms II (с heap)functionminMeetingRoomsHeap(intervals){intervals.sort((a,b)=>a[0]-b[0]);constminHeap=newMinHeap();for(letintervalofintervals){if(minHeap.size()>0&&minHeap.peek()<=interval[0]){minHeap.pop();}minHeap.push(interval[1]);}returnminHeap.size();}
13. Bit Manipulation
XOR tricks
// Single Number (один элемент встречается 1 раз, остальные 2)functionsingleNumber(nums){letresult=0;for(letnumofnums){result^=num;// XOR: a ^ a = 0, a ^ 0 = a}returnresult;}// Missing NumberfunctionmissingNumber(nums){letxor=0;for(leti=0;i<=nums.length;i++){xor^=i;}for(letnumofnums){xor^=num;}returnxor;}
Count bits
// Number of 1 Bits (Hamming Weight)functionhammingWeight(n){letcount=0;while(n!==0){count++;n&=(n-1);// удаляет самый правый 1 бит}returncount;}// Counting Bits (от 0 до n)functioncountBits(n){constresult=newArray(n+1).fill(0);for(leti=1;i<=n;i++){result[i]=result[i>>1]+(i&1);}returnresult;}
Bit operations
// Полезные операцииfunctionbitOperations(){// Проверить, установлен ли i-й битconstisSet=(num,i)=>(num&(1<<i))!==0;// Установить i-й битconstsetBit=(num,i)=>num|(1<<i);// Очистить i-й битconstclearBit=(num,i)=>num&~(1<<i);// Переключить i-й битconsttoggleBit=(num,i)=>num^(1<<i);// Проверить, степень ли 2constisPowerOfTwo=(n)=>n>0&&(n&(n-1))===0;// Получить самый правый установленный битconstrightmostSetBit=(n)=>n&-n;return{ isSet, setBit, clearBit, toggleBit, isPowerOfTwo, rightmostSetBit };}// Reverse BitsfunctionreverseBits(n){letresult=0;for(leti=0;i<32;i++){result=(result<<1)|(n&1);n>>=1;}returnresult>>>0;// unsigned right shift}
// Word Search II (найти все слова из словаря на доске)functionfindWords(board,words){consttrie=newTrie();for(letwordofwords){trie.insert(word);}constresult=newSet();constm=board.length,n=board[0].length;functionbacktrack(i,j,node,path){if(i<0||i>=m||j<0||j>=n||board[i][j]==='#')return;constchar=board[i][j];if(!node.children[char])return;node=node.children[char];path+=char;if(node.isEndOfWord){result.add(path);}consttemp=board[i][j];board[i][j]='#';backtrack(i+1,j,node,path);backtrack(i-1,j,node,path);backtrack(i,j+1,node,path);backtrack(i,j-1,node,path);board[i][j]=temp;}for(leti=0;i<m;i++){for(letj=0;j<n;j++){backtrack(i,j,trie.root,'');}}return[...result];}
15. Advanced
Segment Tree
// Segment Tree для Range Sum QueryclassSegmentTree{constructor(nums){this.n=nums.length;this.tree=newArray(4*this.n).fill(0);if(this.n>0)this.build(nums,0,0,this.n-1);}build(nums,node,start,end){if(start===end){this.tree[node]=nums[start];return;}constmid=Math.floor((start+end)/2);constleftNode=2*node+1;constrightNode=2*node+2;this.build(nums,leftNode,start,mid);this.build(nums,rightNode,mid+1,end);this.tree[node]=this.tree[leftNode]+this.tree[rightNode];}update(idx,val,node=0,start=0,end=this.n-1){if(start===end){this.tree[node]=val;return;}constmid=Math.floor((start+end)/2);constleftNode=2*node+1;constrightNode=2*node+2;if(idx<=mid){this.update(idx,val,leftNode,start,mid);}else{this.update(idx,val,rightNode,mid+1,end);}this.tree[node]=this.tree[leftNode]+this.tree[rightNode];}query(left,right,node=0,start=0,end=this.n-1){if(right<start||left>end)return0;if(left<=start&&end<=right)returnthis.tree[node];constmid=Math.floor((start+end)/2);constleftNode=2*node+1;constrightNode=2*node+2;constleftSum=this.query(left,right,leftNode,start,mid);constrightSum=this.query(left,right,rightNode,mid+1,end);returnleftSum+rightSum;}}
Fenwick Tree (Binary Indexed Tree)
// Fenwick Tree для Range Sum QueryclassFenwickTree{constructor(n){this.n=n;this.tree=newArray(n+1).fill(0);}update(idx,delta){idx++;// 1-indexedwhile(idx<=this.n){this.tree[idx]+=delta;idx+=idx&-idx;// добавить последний установленный бит}}query(idx){idx++;// 1-indexedletsum=0;while(idx>0){sum+=this.tree[idx];idx-=idx&-idx;// удалить последний установленный бит}returnsum;}rangeQuery(left,right){returnthis.query(right)-(left>0 ? this.query(left-1) : 0);}}// Range Sum Query - MutableclassNumArray{constructor(nums){this.nums=nums;this.fenwick=newFenwickTree(nums.length);for(leti=0;i<nums.length;i++){this.fenwick.update(i,nums[i]);}}update(index,val){constdelta=val-this.nums[index];this.nums[index]=val;this.fenwick.update(index,delta);}sumRange(left,right){returnthis.fenwick.rangeQuery(left,right);}}
// По возрастаниюarr.sort((a,b)=>a-b);// По убываниюarr.sort((a,b)=>b-a);// Custom comparatorarr.sort((a,b)=>{if(a[0]!==b[0])returna[0]-b[0];returna[1]-b[1];});