# Mock Interview - Willy & Tristina # Sep 1 ## Willy [680. Valid Palindrome II](https://leetcode.com/problems/valid-palindrome-ii/) https://leetcode.com/problems/valid-palindrome-ii/discuss/107751/C%2B%2B-clean-solution-O(n) https://leetcode.com/problems/valid-palindrome-ii/discuss/404606/C%2B%2B-Easy-to-understand :::info s = 'aba' output = True s = 'abca' 'aca', 'aba' output = True s = 'abcda' output = False s = "abcdedca" 1 2 already_remove = flase; if (s[index1] != s[index2]) { if (s[index1] == s[index2-1]) { index2-- already_remove = true } else if (s[index1+1] == s[index2]) index1++ already_remove = true else return false; } end condition: index1 >= index2 Palindrome (回文) 2 abcdedca 1 2 ebcbbececabbacecbbcbe 1 ::: ```c++= bool temp_string(string s) { int index1 = 0, index2 = s.size()-1; int diff = -1; bool remove = false; while(index1 < index2) { if (s[index1] != s[index2]) { if (remove == true && diff != 0 ) { index1 = diff; index2 = s.size() - 1 - diff; diff = 0; remove = false; } if (diff > -1) { if (remove == false && s[index1+1] == s[index2]) { index1++; remove = true; } else if (remove == false && s[index1] == s[index2-1]) { index2--; remove = true; } else return false; } if (remove == false && s[index1] == s[index2-1]) { index2--; remove = true; diff = index1; } else if (remove == false && s[index1+1] == s[index2]) { index1++; remove = true; diff = index2; } else return false; } index1++; index2--; } return true; } ``` ------------------------- ## Tristina [746. Min Cost Climbing Stairs](https://leetcode.com/problems/min-cost-climbing-stairs/) :::info cost= [10, 30, 40, 10] "" mincost 1. every step min number 2. sum minize 4,3 4-> (3,2)#10 3-> (2,1)#10 2-> (1,0)#10 3-> (2,1)#10 2-> (1,0)#10 1 -> cost[1]#30 0 -> cost[0]#10 1-> cost[1]#30 #give sub array #return minSum ::: ```python= #cost= "" [10, 30, 40, 10] "" # [10, 30, 50, 40] # first = 10 # second = 30 # n ==2 # temp = cost[n] + min (first, second) # first = second # second = temp; #013 #01234 # def minSum(self, cost: List[int]): dp = [0 for i in range(len(cost))] return subminSum(cost, len(cost))#cost, 4 def subminSum(cost, sub_index): if sub_index<=1: # do something return cost[sub_index] return min(subminSum(cost, sub_index-1)+cost[sub_index-1],subminSum(cost, sub_index-2)+cost[sub_index-2]) return def minSum(self, cost: array): tmpSum = 0 i == 0 while (i < len(cost)): if (cost[i]<cost[i+1]): tmpSum = tmpSum + cost[i] i = i+1 else: tmpSum = tmpSum + cost[i+1] i=i+2 return tmpSum #10+30+10 =50 / 30+10 = 40 ``` # Sep 8 ## Willy [1629. Slowest Key](https://leetcode.com/problems/slowest-key/) :::info releaseTimes = [9,29,49,50], keysPressed = "cbcd" output = "c" c->9 b->20 c->20 d->1 time = 0 {'', -1} =>{'c', 9} =>{'b', 20}=>{'c', 20}... ret(max_time) = 20 ::: ```c++= char slowestKey(vector<int>& releaseTimes, string keysPressed) { if (keysPressed.empty()) return ''; int time = 0; char cur_ch = keysPressed[0]; //c int cur_max_time = releaseTimes[0]; // 9 for(int i = 1; i < keysPressed.size(); i++) { if (releaseTimes[i] - releaseTimes[i-1] > cur_max_time) { //20 > 9 cur_max_time = releaseTimes[i] - releaseTimes[i-1]; // 20 cur_ch = keysPressed[i]; // b } else if (releaseTimes[i] - releaseTimes[i-1] == cur_max_time && keysPressed[i] > cur_ch) //20 , c>b cur_ch = keysPressed[i]; //c } return cur_ch; } ``` ------------------------- ## Tristina [206. Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/) :::info 1->8->5->4->null => 4->5->8->1->null def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: list = [] list.append() list.pop() #remain_list =[8 5 4 null] node = head while node !=None: # do things node = node.next 8.next = new_list ListNode -> 4->5->8-> 1->null ::: :::warning 名稱定義 ::: ```python= class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: #1->8->5->4->null node = head.next#8 result = head#1 result.next = None#? #1-> none while node:#8/ 5/4/none node.next = result#8->1->none/ 5->8->1->none/ 4->5->8->1->none result = node#8->1->none/5->8->1->none/4->5->8->1->none node = node.next#5 /4/none return result#4->5->8->1->none ''' def reverseList(self, head): prev = None curr = head while curr: next = curr.next curr.next = prev prev = curr curr = next return prev ''' ``` # Sep 18 ## Willy [917. Reverse Only Letters](https://leetcode.com/problems/reverse-only-letters/) :::info Input1 = "ab-cd" Output1 = "dc-ba" Input2 = "a-bC-dEf-ghIj" Output2 = "j-Ih-gfE-dCba" i ab-cd j i ab-cd j i db-ca j i dc-ba j end condition i >= j ::: i j-Ih-gfE-dCba j ```c++= bool isAlpha(char s) { if (s - 'a' >= 0 && s - 'a' <= 25) // a to z return true; if (s - 'A' >= 0 && s - 'A' <= 25) // A to Z return true; retur false; } string reverseStr(String &str) { int i = 0, j = str.size() - 1; while(i < j) { while(str[i] == false) { i++; } while(str[j] == false) { j--; } swap(str[i], str[j]); i++; j--; } return str; } ``` ------------------------- ## Tristina [53. Maximum Subarray](https://leetcode.com/problems/maximum-subarray/) :::info nums = [-2,1,-3,4,-1,2,1,-5,4] 4,-1,2,1 => 6 nums = [5,4,-1,7,8] 23 [-2, 1, -3] -2 + 1 = -1 -10^5 <= nums[i] <= 10^5 1. for loop 2. check add new item > tmpMax sum = 1 tmpMax = -2+1 ::: ```python= ''' [5,4,-1,7,8] [-2,1,-3,4,-1,2,1,-5,4] tmpSum = 23 tmpMax = 15 [2, 3] ''' def maxSubArray(self, nums: List[int]) -> int: tmpSum = nums[0] tmpMax = nums[0] for n in nums[1:]: tmpSum = max(tmpSum + n, n) #23 if (tmpMax < tmpSum)&& (n < tmpSum): tmpMax = tmpSum#23 #check if n > tmpSum:# tmpSum = n tmpMax = tmpSum return tmpMax#23 ``` # Sep 18 ## Willy [350. Intersection of Two Arrays II](https://leetcode.com/problems/intersection-of-two-arrays-ii/) :::info nums1 = [1,2,2,1], nums2 = [2,2] -> [2,2] nums1 = [4,9,5], nums2 = [9,4,9,8,4] -> [4,9] [4,5,9] map[4] = 0 map[5] = 1 map[9] = 0 [9, 4] ::: ```c++= vector<int> common_num(vector<int> nums1, vector<int> nums2) { unordered_map<int, int> map; int m = nums1.size(); int n = nums2.size(); vector<int> common; for (int i = 0; i < m; i++) map[nums1[i]]++; for (int j = 0; j < n; j++) { if (map.find(nums2[j]) != map.end() && map[nums2[j]]> 0) { map[nums2[j]]--; common.push_back(nums2[j]); } } return common; } ``` ------------------------- ## Tristina [101. Symmetric Tree](https://leetcode.com/problems/symmetric-tree/) :::info class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def isSymmetric(self, root: Optional[TreeNode]) -> bool: 1 / \ 2 2 / \ / \ 3 4 4 3 / \ / \ / \ / \ None 4 3 4 43 4 None root.left.val = root.right.val root.left.left.val = root.right.right.val root.left.right.val = root.right.left.val root.left.right.left.val = root.right.left.right.val cur1 = root.left cur2 = root.right if cur1.val == cur2.val: if checkEqual(cur1, cur2): if cur1.right.val == cur2.left.val: def checkEqual(cur1, cur2):#input nodes if cur1.val != cur2.val: return False elif cur1.val == None: return True else: checkEqual(cur1.left, cur2.right) checkEqual(cur1.right, cur2.left) 1 / \ 2 2 / \ /\ n n n n ::: ``` python= class Solution: def isSymmetric(self, root: Optional[TreeNode]) -> bool: if root == None: return True def checkEqual(cur1, cur2):#input nodes (2,2) #(None,None) if cur1 == None or cur2 == None: return (cur1 == cur2)? True: False elif cur1.val != cur2.val: return False return checkEqual(cur1.left, cur2.right) && checkEqual(cur1.right, cur2.left) return checkEqual(root.left, root.right)#2,2 ``` -------------------------- # Oct 1 ## Willy [252. Meeting Rooms](https://leetcode.com/problems/meeting-rooms/) :::info Input: [[0,30],[5,10],[15,20]] Output:->false [[7,10],[2,4]] ->true [[2,4],[7,10]] [[2,4],[7,10],[15,20]] [[2,4],[7,16],[15,20]] ::: ```c++= bool meeting(vector<vector<int>> &list) { sort(list.begin(), list.end()); for (int i = 0; i < list.size() - 1; i++) { if (list[i][1] > list[i+1][0]) return false; } return true; } ``` ![](https://i.imgur.com/PvAKAfo.png) ![](https://i.imgur.com/z6V0Fk2.png) ------------------------- ## Tristina [203. Remove Linked List Elements](https://leetcode.com/problems/remove-linked-list-elements/) :::info head = [1,2,6,3,4,5,6] val = 6 [1,2,3,4,5] [1,2,6,3,4,5,6] curr tmp curr tmp : 1,2,3 head: Optional[ListNode], val: int ::: ``` python= # def __init__(self, val=0, next=None): # self.val = val # self.next = next def removeTarget(self, head: Optional[ListNode, val:int]): ''' prev -> [Null,1,2,6,3,4,5,6] tmp curr -> [1,2,6,3,4,5,6] curr dummy ''' #prev = ListNode(0) #prev.next = head [] tmp = None# ListNode(0) #tmp = prev curr = head while curr: if (curr.val == val): if tmp: tmp.next = curr.next else: head = curr.next else: tmp = curr curr = curr.next return head ``` -------------------------- # 10/10 ## Willy []() ## Willy [11. Container With Most Water](https://leetcode.com/problems/container-with-most-water/) :::info **Example1** height = [1,8,6,2,5,4,8,3,7] Output: 49 **Example2** height = [1,8] Output: 1 **Example3** height = [1,1,1] | | | Output: 2 [1,8,12,2,5,4,8,3,7] i j max = 49 [1,1] ::: ```c++= int max_water(vector<int> w) { int i = 0; int j = w.size() - 1; // 1 int max_w = 0; while(i < j) { max_w = max(max_w, min(w[i],w[j])*(j-i)); if (w[i] > w[j]) j--; else i++; } return max_w; } ``` ------------------------- ## Tristina [100. Same Tree](https://leetcode.com/problems/same-tree/) :::info 1 1 / \ / \ 2 3 3 3 Output: false def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool: ::: ``` python= def TreesAreSame(self, p:Optional[TreeNode],q:Optional[TreeNode]): def isSame(node1, node2): if node1 == None and node2 == None: return True elif node1 == None or node2 == None: return False else: ''' 1. if the node1 == node2 2. isSame(node1.left,node2.left) ''' return node1.val == node2.val and isSame(node1.left,node2.left) and isSame(node1.right, node2.right) return isSame(p,q)# ''' isSame(1,1)/F->isSame(2,3)/F->isSame(2.left,3.left)/T ->isSame(2.right,3.right)/T ->isSame(3,3)/T->isSame(3.left,3.left)/T ->isSame(3.right,3.right)/T False ''' ``` :::success **建議:** 1. 面試時可以跟面試官互動,問他到目前都看得懂嗎等等。 2. 講解英文的流暢度 3. 最後寫好的時候可以說:I think it works. ::: -------------------------- # 10/15 ## Willy [1041. Robot Bounded In Circle](https://leetcode.com/problems/robot-bounded-in-circle/) :::info G L R (0,0) **Example1** "GGLLGG","GGLLGG","GGLLGG","GGLLGG" (0,0)->(0,2)->(0,0) Output: True **Example2** "GG","GG","GG" Output:False "LLLG","LLLG","LLLG","LLLG" "LGRGG" R(+) L(-) rotate = 0 if (retate == 0) return false; else return true; **Example3** "GLGLGGLGL" ::: ```c++= bool rebot(string m) { int rotate = 0; // if (m.empty()) for (int i = 0; i < m.size(); i++) { if (m[i] == 'R') rotate++; else if (m[i] == 'L') rotate--; } return abs(rotate)%4 == 0? false: true; } ``` :::success ::: ------------------------- ## Tristina [160. Intersection of Two Linked Lists](https://leetcode.com/problems/intersection-of-two-linked-lists/) :::info listA = [4,1,8,4,5], listB = [5,6,1,8,4,5] head1: 4 1 \ ^ 8 4 5 head2: 8 6 1 / ^ head1:8 head2:8 listA = [4,1,8,4,5] ^ listB = [5,6,1,8,4,5] ^ for (5) [1, 2][3, 4, 5] [3, 4, 5][1, 2] [4,1,8,4,5][5,6,1,8,4,5] ^ [5,6,1,8,4,5][4,1,8,4,5] ^ 4 2 3 5 - 6 7 4 9 5 3 1 2 / 4 2 4 5 6 1 2 7 8 9 5 3 4 5 6 3 4 7 8 9 ::: ``` python= # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None ''' [4,1,8,4,5]None[5,6,1,8,4,5]None ^ [5,6,1,8,4,5]None[4,1,8,4,5]None ^ nA = [4,1,8,4,5] nB = [5,6,1,8,4,5] ''' def getsameNode(self, headA: ListNode, headB: ListNode) -> ListNode: nA, nB = headA, headB while nA != nB: if nA is not None: nA = nA.next else: nA = headB if nB is not None: nB = nB.next else: nB = headA return nA ``` -------------------------- # 10/23 ## Willy [1209. Remove All Adjacent Duplicates in String II](https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string-ii/) :::info s = "abcd", k = 2 Output: "abcd" s = "deeedbbcccbdaa", k = 3 Output:"aa" s = "fdeeedbbcccbdaaff" k = 3 Output: "faa" int pop; count = 0 stack | temp = fddbbbdaa fddbbbdaa ::: ```c++= //s: aa //st: //temp: aa //count: 0 //pop: 0 string removesfcchar(string &s, int k) { do { int pop = 0; int count = 0; string temp; stack<char> st; for (int i = 0; i < s.size(); i++) { if (st.empty()) { count++; st.push(s[i]); continue; } if (st.top()!=s[i]) { for (int j = 0; j < st.size(); j++) { char c = st.top(); st.pop(); temp.push_back(c); } st.push(s[i]); count = 1; } else { count++; if (count == k) { for (int j = 0; j < st.size(); j++) st.pop(); count = 0; pop++; } else st.push(s[i]); } } if (!st.empty()) { for (int j = 0; j < st.size(); j++) { char c = st.top(); st.pop(); temp.push_back(c); } } s = temp; } while(pop!=0); return s; } ``` :::success ![](https://i.imgur.com/t9iyxRN.png) ![](https://i.imgur.com/dqMxbLV.png) ![](https://i.imgur.com/pUMBxvr.png) ![](https://i.imgur.com/6I3z3CM.png) ![](https://i.imgur.com/OQ3mRJh.png) ::: ------------------------- ## Tristina [876. Middle of the Linked List](https://leetcode.com/problems/middle-of-the-linked-list/) :::info 1->2->3->4->5 return 3 S ^ F N ^ 1->2->3->4->5->6 return 4 S ^ F ^ ::: ``` python= def midNode(self, head: Linkedlist[ListNode]): slow = fast = head while fast and fast.next :#5, null #fast.next odes, ex1 #fast evens, ex2 #fast = 5 slow = slow.next fast = fast.next.next #5 return slow ``` -------------------------- # 11/6 ## Willy [977. Squares of a Sorted Array](https://leetcode.com/problems/squares-of-a-sorted-array/) :::info nums = [-4,-1,0,3,10] ans = [0,1,9,16,100] temp = res = [0,1,9,16,100] i [-4,0,2,3,10,11,12] j search -> 2 ans = [1,4,9,16,100,121,144] 0,1,2,3 i [-6,-5,-4,-1,0,3] res: 0, 1, 9, 16, 25, 36 stack: ::: ```c++= vector<int> squresort(vector<int> &nums) { stack<int> temp; vector<int> res; while(i < nums.size()) { if (nums[i] < 0) { temp.push(sqrt(nums[i])); i++; continue; } if (!temp.empty() && temp.top() < sqrt(nums[i])) { int val = temp.top(); res.push_back(val); temp.pop(); } else { res.push_back(sqrt(nums[i]); i++; } } while(!temp.empty()) { int val = temp.top(); res.push_back(val); temp.pop(); } return res; } ``` :::success ::: ------------------------- ## Tristina [1382. Balance a Binary Search Tree](https://leetcode.com/problems/balance-a-binary-search-tree/) :::info [1,null,2,null,3,null,4,null,null] 1 \ 2 \ 3 \ 4 2 / \ 1 3 \ 4 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right dfs(root) values = [1,2,3,4] id = 0,1,2,3 0+3//2 ->1 values[1] ->2 ans = TreeNode(values[1]) [1,2,3,4] [1][2][3,4] [3][4] 2 / \ 1 3 \ 4 2 / \ 1 4 / 3 ::: ``` python= def sol(self, root: TreeNode): #[1,null,2,null,3,null,4,null,null] ''' values = [1,2,3,4] buildTree(0,3) lid = 0 rid = 3 mid = 1 ans = 2 ans.left = 1 lid = 0 rid = 0 mid = 0 ans.right = 3 lid = 2 rid = 3 mid = 2 ans.right = 3 lid = 2 rid = 3 mid = 2 2 / \ 1 3 \ 4 ''' values = [] def dfs(root): # dfs if not root: return dfs(root.left) values.append(root.val) dfs(root.right) #return values dfs(root) def buildTree(lid,rid): if lid > rid: return None mid = (lid+rid)//2 ans = TreeNode(values[mid]) ans.left = buildTree(lid,mid-1)#2,1 ans.right = buildTree(mid+1,rid)#3,3 return ans return buildTree(0,len(values)-1) ``` -------------------------- # 11/19 ## Willy [526. Beautiful Arrangement](https://leetcode.com/problems/beautiful-arrangement/) [1144. Decrease Elements To Make Array Zigzag](https://leetcode.com/problems/decrease-elements-to-make-array-zigzag/) :::info n = 2 (1,2,3,....100) output = 2 ([1,2],[2,1])[1,2,3,...100],[] 1~n [1,2] perm[i]%i == 0 || i % perm[i] [1,2] -perm[1] = 1 i = 1 -> 1/1 -perm[2] = 2 i=2 -> 2/2 [2,1] perm[1] =2 2/1 i = 2 perm[2] = 1 fun (index, count, visit) ::: ```c++= void perm(int index, int &count, vector<bool> &visit, int n) { for (int i = 1; i < n+1; i++) { if (visit[i]) continue; if (index == n && (i % index == 0 || index % i == 0)) count++; else if (i % index == 0 || index % i == 0) { visit[i] = true; perm (index+1, count, visit, n); visit[i] = false; } } } int perm_count (int n) { int count = 0; vector<bool> visit(false, n); perm (1, count, visit, n); return count; } ``` :::success ::: ------------------------- ## Tristina [103. Binary Tree Zigzag Level Order Traversal](https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/) :::info root = [3,9,20,null,null,15,7] 3 -> L0 / \ 9 20 <- L1 / \ 15 7 ->L 2 Levels = [[L1],[L2],...] if L%2 ==1: -> right to left f(node.right,L) f(node.left, L) else: -> left to right f(node.left, L) f(node.right, L) Output: [[3],[20,9],[15,7]] ::: ``` python= """ root = [3,9,20,null,null,15,7] Levels = [[3],[20,9],[15,7]] addLevels(15,2) root = [1,2,3,4,null,null,5] 1 L0 2 3 L1 <- 4 5 L2 -> Levels = [[1],[3,2],[4, 5,6]] addLevels(5,2) [1,2,3] """ def getLevels(self, root: Tree[TreeNode])-> List[List[int]]: Levels = [] def addLevel(node, L): if node: if len(Levels) == L: Levels.append([]) #new level Levels[L].append(node.val) # right to left if (L+1 )%2 == 1: #odd L1,L3,... addLevel(node.right,L+1) addLevel(node.left, L+1) else:#left to right addLevel(node.left, L+1) addLevel(node.right,L+1) if root: addLevel(root, 0) return Levels ``` -------------------------- # 12/4 ## Willy [435. Non-overlapping Intervals](https://leetcode.com/problems/non-overlapping-intervals/) :::info https://leetcode.com/problems/non-overlapping-intervals/discuss/1181973/C%2B%2B-greedy https://leetcode.com/problems/non-overlapping-intervals/discuss/1283600/C%2B%2B-or-Explained-or-Greedy-and-DP-or https://leetcode.com/problems/non-overlapping-intervals/discuss/792726/C%2B%2B-Simple-O(NlogN)-solution-with-explanation intervals = [[1,2],[1,3],[2,4],[3,4]] -> [[1,2],[2,3],[3,4]] output =1 [1,3] intervals = [[1,2],[1,2],[1,2]] -> [[1,2]] output = 2 intervals = [[1,2],[2,3]] output = 0 [1,2][1,2] [1,2][1,3] [2,4][3,4][4,5] int count = 0; sort(nums); while(i < nums.size()-1) if(nums[i][0] < nums[i-1][1] || nums[i][1] > nums[i+1][0]) count++; return count; [[1,2],[2,3],[3,4],[1,3]] [[1,2],[1,3],[2,3],[3,4]] count = 1 [[1,4],[1,5],[2,3],[3,4]] [[2,3],[1,4],[3,4],[1,5]] ^ i count = 1 [[1,4],[2,4],[3,4],[1,5]] ::: ```c++= bool static comp(pair<int, int> a, pair<int, int>b) { return a.second < b.second; } int eraseOverlapIntervals(vector<vector<int>>& intervals) { int count = 0; int i = 1; int pre = i - 1; sort(intervals.begin(), intervals.end(), comp); while(i < intervals.size()-1) { if (intervals[i][0] < intervals[pre][1]) { count++; } else { pre = i; } i++; } return count; } || ``` ::: ::: ------------------------- ## Tristina [75. Sort Colors](https://leetcode.com/problems/sort-colors/) :::info [2,0,2,1,1,0] nums = [0,0,1,1,2,2] nums = [0,0,2,1,1,2] ^ ^ ^ l m left side < m < right side r if l > m -> swap(l,m) if m > r -> swap (m,r) if l is 0 -> i++ if m is 1 -> m++ if r is 2 -> r-- if(nums[mid] == 0) else if(nums[mid] == 1) else #mid ==2 output = [0,0,1,1,2,2] Space complexity: O(1) def sortColors(self, nums: List[int]) -> None: ::: ``` python= def sortColors(self, nums: List[int]) -> None: """ [0,1,2] l m r """ """ [0,0,1,1,2,2] l m r """ l = m = 0 r = len(nums)-1 while m <= r: # check left side if nums[m] ==0: #compare with l nums[l], nums[m] = nums[m], nums[l] m += 1 l += 1 # check right side elif nums[m] == 2: nums[r], nums[m] = nums[m], nums[r] r -=1 #else (when the m is 1, then only move on) else: # m ==1 m +=1 ``` -------------------------- # 12/19 ## Willy [647. Palindromic Substrings](https://leetcode.com/problems/palindromic-substrings/) :::info s = "abc" palindromic substrings output:3 "a","b","c" Input: s = "aaa" Output: 6 Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa". | cbbc ^ ^ 4*4 4*3*2*1 = n! ::: ```c++= int fun(string &s){ int count = 0; for (int i = 0; i < n; ++i) { for (int j = i; j < n; ++j) { count+= palindromic(s, i, j); } } return count; } int palindromic(string &s, int i, int j) { if (i >= j) return 1; return s[i] == s[j]? palindromic(s, i+1, j-1) : 0; } ``` Manacher's algorithm ``` python= class Solution: #https://leetcode.com/problems/palindromic-substrings/discuss/392119/Solution-in-Python-3-(beats-~94)-(six-lines)-(With-Detaiiled-Explanation) def countSubstrings(self, s: str) -> int: L, r = len(s), 0 for i in range(L): for a,b in [(i,i),(i,i+1)]: while a >= 0 and b < L and s[a] == s[b]: a -= 1; b += 1 r += (b-a)//2 return r ``` ::: ::: ------------------------- ## Tristina [739. Daily Temperatures](https://leetcode.com/problems/daily-temperatures/) :::info temperatures = [73,74,75,71,69,72,76,73] 0. 1, 2, 3,4, 5 cur while the temp of the stack[-1] day < cur temp: pop the day in the stack and to check the distance ( cur day - prev day) stack = [2,5] cur = 5 prev = 3 # stack[-1].pop() cur-prev ans = [1,1,0,2,1,0,0,0] Output: [1,1,4,2,1,1,0,0] [73,73] [0,0] ::: ``` python= #temperatures = [69,72,76,73] ''' cur_day = 3 cur_tmp = 73 prev_day = 1 stack = [2] ans = [1,1,0,0] ''' def checkTemp(self, temperatures: List[int])-> List[int]: ans = [0]*len(temperatures) stack = [] for cur_day, cur_tmp enumerate(temperatures): # while loop to compare the temperatures between prev day and cur day while stack and temperatrues[stack[-1]] < cur_tmp: prev_day = stack.pop() ans[prev_day] = cur_day-prev_day # append the cur day inside to the stack stack.append(cur_day) return ans ``` -------------------------- # Dec 24 ## Willy [199. Binary Tree Right Side View](https://leetcode.com/problems/binary-tree-right-side-view/) :::info 1 2 3 5 4 root = [1,2,3,null,5,null,4] Output: [1,3,4] queue: store nodes of current level cur_nums:record the number of current nodes //queue: store nodes of chilren of current level vector<Node*> res: output q: nums: 0 temp: 4 //when nums become zero res: 1, 3, 4 ![](https://i.imgur.com/pE86OvR.png) ::: ```c++= vector<Node*> rightnodes(Node* root) { queue<Node*> q; int cur_nums = 0; vector<Node*> res; q.push(root); cur_nums = 1; while (!q.empty()) { Node* temp; temp = q.front(); if (temp->left) { q.push(temp->left); } if (temp->right) { q.push(temp->right); } q.pop(); --cur_nums; if (cur_nums == 0) { res.push_back(temp); cur_nums = q.size(); } } return res; } ``` ------------------------- ## Tristina [1020. Number of Enclaves](https://leetcode.com/problems/number-of-enclaves/) :::info {{0,0,0,0}} {{0,0,0,0}} {{0,0,0,0}} {{0,0,0,0}} enclave 3 Matrix #dfs() #go through the rest of the element #change the Matrix[i][j] = 0 #check each element for loop for the cols for loop for rows: #1.if the element is not enclave (4 edges) #2.if the element ==1: dfs()#check the island #the rest would be ennclave island for for #count the elements ::: ``` python= class solution: def enclave(self, Matrix: List[List[int]])->int: def dfs(Matrix,i, j): #edge case if i <0 or j<0 or i> len(Matrix)-1 or j > len(Matrix[0])-1 or Matrix[i][j]==0: return #change the element #if Matrix[i][j]==1: Matrix[i][j]=0 dfs(Matrix,i-1,j) dfs(Matrix,i+1,j) dfs(Matrix,i,j-1) dfs(Matrix,i,j+1) #check clave for i in range(len(Matrix)): for j in range(len(Matrix[0])): #check 4 edges and Matrix[i][j] ==1 if i ==0 or j ==0 or i == len(Matrix)-1 or j == len(Matrix[0])-1: #if Matrix[i][j] ==1: dfs(Matrix, i, j) #count numbers count = 0 for i in range(len(Matrix)): for j in range(len(Matrix[0])): if Matrix[i][j]==1: count +=1 return count ``` -------------------------- # 1/9 ## Willy [448. Find All Numbers Disappeared in an Array](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/) :::info nums = [-4,-3,-2,-7,8,2,-3,-1] #1~8 [5,6] nums = [1,1]#1~2 [2] size = nums.size() arr[size] arr[nums[i]-1]++; res; for (i = 0; i < size; i++) if (arr[i] == 0) res.push_back(i+1) ::: ```c++= vector<int> fun(vector<int> in) { int size = nums.size(); vector<int> arr(size, 0); // state vector<int> res; for (int num: in) arr[num-1]++; for (int i = 0; i < size; i++) if (arr[i] == 0) res.push_back(i+1); return res; } ``` ::: ::: ------------------------- ## Tristina [653. Two Sum IV - Input is a BST](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/) :::info root = [5,3,6,2,4,null,7], k = 9 5 / \ 3 6 / \ \ 2 4 7 true class Solution: def findTarget(self, root: Optional[TreeNode], k: int) -> bool: hashmap ={} k - a = b b in hashmap -> True ::: ``` python= class Solution: def findTarget(self, root: Optional[TreeNode], k: int) -> bool: hashmap = {}#{5:1,3:1,2:1} return findNext(root)#5 def findNext(root):#6 num = k - root.val#3 if root is None: return False if num in hashmap: return True hashmap[root.val] = 1 # 2 return findNext(root.left) or findNext(root.right) ``` -------------------------- # 1/9 ## Willy [448. Find All Numbers Disappeared in an Array](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/) :::info nums = [-4,-3,-2,-7,8,2,-3,-1] #1~8 [5,6] nums = [1,1]#1~2 [2] size = nums.size() arr[size] arr[nums[i]-1]++; res; for (i = 0; i < size; i++) if (arr[i] == 0) res.push_back(i+1) ::: ```c++= vector<int> fun(vector<int> in) { int size = nums.size(); vector<int> arr(size, 0); // state vector<int> res; for (int num: in) arr[num-1]++; for (int i = 0; i < size; i++) if (arr[i] == 0) res.push_back(i+1); return res; } ``` -------------------------- # 1/13 ## Willy [1877. Minimize Maximum Pair Sum in Array](https://leetcode.com/problems/minimize-maximum-pair-sum-in-array/) :::info [2,5,6,8] -> 11 (2,8)(5,6) sort-> two pointers from first and last -> global sum sum = 11 nums = [3,5,2,3] (3,3)(5,2) -> 7 6,7 (3,5)(2,3) -> 8 Output: 7 nums = [3,5,4,2,4,6] (3,5)(4,4)(2,6) -> 8 (5,4)(4,3)(4,6) -> 9 Output: 8 [3,5,4,2,4,6] [2,3,4,4,5,6] ::: ```c++= int fun(vector<int> nums) { if (nums.empty()) return 0; sort(nums, nums.begin(), nums.end()); int i = 0, j = nums.size()-1; int sum = 0; while ( i < j) { if (sum < nums[i] + nums[j]) sum = nums[i] + nums[j]; ++i; --j; } return sum; } ``` ::: ::: ------------------------- ## Tristina [1343. Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold](https://leetcode.com/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold/) :::info arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4 ^ ^ ^ [5,5,8] ->6 > 4 arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5 ::: ``` python= ''' [11,13,17,23,29,31,7,5,2,3] i i = 2 TOTAL = 15 reuslt = 6 tmp_sum = 5+2+3 ''' def findBigger(self, arr:List[int], k:int, threshold:int)-> int: TOTAL = k*threshold reuslt = 0 tmp_sum = 0 for i in range(len(arr)): tmp_sum += arr[i] if i >= k:#3 tmp_sum -= arr[i-k] if i+1 >=k and tmp_sum >= TOTAL: reuslt +=1 return result ``` -------------------------- # 1/22 ## Willy [153. Find Minimum in Rotated Sorted Array](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/) :::info nums = [3,4,5,1,2] output:1 [1,2,3,4,5] rotated 3 times nums = [4,5,6,7,0,1,2] output:0 [0,1,2,4,5,6,7] [11,13,15,17] output: 11 [11,13,15,17] return nums min time complexity < O(logn) [4,5,6,7,0,1,2] mid > l and mid > r => l and r smaller? l = mid [0,1,2,4,5,6,7] mid > l and mid < r => l and r smaller? r = mid [5,6,7,0,1,2,4] mid < l and mid < r [4,5,6,7,0,1,2] mid < l and mid > r // X mid > mid + 1 -> return mid + 1 # 7 mid -1 > mid -> return mid #0 4 5 6 7 8 1 2 1 2 4 5 6 7 8 l < r => r = mid l > r => l = mid [11,13,15,17] l = 11 r = 17 m = 13 ::: ```c++= int fun(vector<int> nums) { int l = 0; int r = nums.size() - 1; int m = l + (r - l)/2; while (l < r) { if (nums[m] > nums[m+1]) return nums[m+1]; else if (nums[m-1] > nums[m]) return nums[m]; else if (nums[l] < nums[r]) r = m-1; else l = m; } return nums[l]; } ``` ------------------------- ## Tristina [621. Task Scheduler](https://leetcode.com/problems/task-scheduler/) :::info tasks = ["A","A","A","B","B","B"], n = 2 output=8 A -> B -> idle -> A -> B -> idle -> A -> B ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2 Output: 16 A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> idle -> idle -> A -> idle -> idle -> A ["A","A","A","B","B","D","D","C","C"] A->B->D->A->B->D->A-> A->B->C->A->B->D->A->C->D = size() = 9 empty :0 empty + len(tasks) (max_freq - 1) * (n+1) + 1 [2,2] empty. = 4 ["A","A","A","B","B","B"] [3,3] A -> B ->i ->A ->B ->i ->A -> B 2 * 3 = 6 if (task_freq == max_freq ) add A and B (max_freq - 1) * (n+1) + 1. get the freq 2. sort freq 3. max_freq = freq.pop() 4. empty = (max_freq-1)*n 5. empty - 6. result = len(tasks)+empty ["A","A","A","B","B","D","D","C","C"] map ={"A":3} 3 max_nums = 1 2*3+1 ::: ``` python= def getMinTime(self, tasks:List[str],n: int)-> int: map = {} max_freq = 0 max_nums = 0 for t in tasks: map[t]+=1 max_freq = max(max_freq, map[t]) for v in map.values(): if v ==max_freq: max_nums +=1 return max(len(task),(max_freq - 1)*(n+1)+ max_nums) ``` -------------------------- # 2/12 ## Willy [697. Degree of an Array](https://leetcode.com/problems/degree-of-an-array/) :::info nums = [1,2,2,3,1] [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2] output = 2 nums = [1,2,2,3,1,4,2]<-degree =3 [2,2,3,1,4,2] max = 2 max_degree = 1 res = [2,2] output = 6 hashmap -> max_degree = 0 res = [2,2,3,1,4,2] ::: ```c++= vector<int> fun (vector<int> arr) { int max_degree = 0; int max; unordered_map<int, int> map; vector<int> res; for (int num: arr) { map[num]++; if (map[num] > max_degree) { max_degree = map[num]; max = num; } } for (int num: arr) { if (num != max && res.empty()) continue; res.push_back(num); if (num == max) max_degree--; } return res; } ``` ::: ::: ------------------------- ## Tristina [1221. Split a String in Balanced Strings](https://leetcode.com/problems/split-a-string-in-balanced-strings/) :::info s = "RLRRLLRLRL" ^ RL RRLL RL RL output = 4 count =0 output = 4 ::: ``` python= def countRL(self, s:str)->int: count = 0 output = 0 for v in s: if v =="R": count +=1 else: count -=1 if count ==0: output +=1 return output ``` -------------------------- # 2/20 ## Willy [560. Subarray Sum Equals K](https://leetcode.com/problems/subarray-sum-equals-k/) :::info nums = [-1,-1,1,1,1,1], k = 2 i j [1,1,1,-1][1,1,1,-1][1,1,1,1,-1,-1][1,1][1,1] output =2 nums = [1,2,3], k = 3 0 1 3 6 [1,2] [3] output = 2 [1,2,3,2,1] k = 3 0 1 3 6 8 9 j 3-3 = 0 HashTable = {sums:count} {0:1,1:1,3:1,6:1...} HashTable[6] Sum - preSum = k prefixSum = sum -k [1,-1,0] 1, 0, 0 k = 0 0:3 1:1 ::: ```c++= int subarr(vector<int> nums, int k) { unordered_map<int, int> map; int res = 0; int sum = 0; map[0]++; for (int i = 0; i < nums.size(); i++) { sum+= nums[i]; if (map[sum - k]) res++; map[sum]++; } return res; } ``` ::: ::: ------------------------- ## Tristina [1029. Two City Scheduling](https://leetcode.com/problems/two-city-scheduling/) :::info costs = [[10,20],[30,200],[400,50],[30,20]] =>2n = 4 (2~100) first person [10,20] => [Acost, Bcost] first pick A => 10 2 => 30 3 =>50 4 => 20 cost = 110 p1 -> 10 20. -> -10 p2 -> 30 200 -> -170 p3 -> 400 50 -> 350 p4 -> 30 20 -> 10 the cost of picking the Acity pickA = [-170, -10,10, 350] ::: ``` python= class Solution: def twoCitySchedCost(self, costs: List[List[int]]) -> int: pickA_cost = [] #costs sorted by picking A's difference costs.sorted(key = lambda x: x[0]-x[1]) n = len(costs)//2 res = 0 for i in range(n): res += costs[i][0]+costs[i+n][1] return res ``` -------------------------- # 3/13 ## Willy [974. Subarray Sums Divisible by K](https://leetcode.com/problems/subarray-sums-divisible-by-k/) :::info nums = [4,5,0,-2,-3,1],k =5 output = 7 [4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3] nums = [5], k = 9 output = 0 [4, 5, 0, -2,-3,1] [4, 4, 4, 2, 4, 0] res = 1 + 2 + 3 + 1 {"4":3} {"2":1} {"0":1} count += dict['4'] dict['4']+=1 ::: ```c++= int fun (vector<int> nums, int k) { unordered_map<int, int> record; int res = 0; int remain = 0; for (int num: nums) { remain = (remain + num) % k; if (remain % k == 0) res++; if (record.find(remain) != record.end()) { res += record[num]; record[num]++; } else record[num] = 1; } return res; } ``` ::: ::: ------------------------- ## Tristina [82. Remove Duplicates from Sorted List II](https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/) :::info head = [1,2,5] head = [1,1,1,2,3] [2,3] 1. sorted linkedlist 2. 0<len(linkedlist)<300 [1,2,3] [1,2,3] head = [1,2,3,3,3,4,4,5] p c n c p.next = n c = p.next #4 # go through each element set it as prev # check if the cur and the next is the same c = prev.next next while c.value == n.value: change the next to the next one else: c = c.next # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next ::: ``` python= 0 [1,2,3,3,4,4,5] p c n 2-> 4 c def removeDuplicates(self, head: LinkNode): # prev newList = ListNode(0,head) prev = newList cur = prev.next #go through while cur and cur.next: # cur = prev.next # next_node = cur.next # if cur.value != next_node.value: # prev = prev.next # break # #check if cur and next is Equal # while cur.value == next_node.value: # next_node = next_node.next # prev.next = None # prev.next = next_node # #cur = prev.next # prev = prev.next if cur.value != cur.next.value:#cur.value != cur.next.value prev = prev.next else: while cur and cur.next and cur.value == cur.next.value: cur = cur.next prev.next = cur.next cur = cur.next return newList.next ``` -------------------------- # 3/27 ## Willy [18. 4Sum](https://leetcode.com/problems/4sum/) :::info nums = [2,7,11,15], target = 9 output = [0,1] hashmap <int(number), int(index)> 2 -> [target - 2] if exist , push index to res if not , [2] = 0 7 -> [2] exist, push 2's index and push current index Input: nums = [1,0,-1,0,-2,2], target = 0, k = 4 Output: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]] Input: nums = [2,2,2,2,2], target = 8, k = 4 Output: [[2,2,2,2]] [-2, -1 0, 0, 1, 2] def kSum(nums,target,k): k ==2: twoSum(nums,target) for i in range(len(nums)): for subset in kSum(nums[i+1:],target-nums[1],k-1): res.append([nums[i]]+ subset) vector<vector<int>> kSum(vector<int>& nums, int target, int start, int k) { for (vector<int>& subset : kSum(nums, static_cast<long>(target) - nums[i], i + 1, k - 1)) { # } ::: ```c++= vector<int> twosum(vector<int> nums, int target) { vector<int> res; int i = 0; //index unordered_map<int, int> map; while(i < nums.size()) { if (map.find(target - nums[i])!=map.end()) { res.push_back(map[target - nums[i]]); res.push_back(i); break; } else map[nums[i]] = i; i++; } return res; } vector<int> ksum2(vector<int> nums, int target, int k, int index) { vector<int> res; for (int i = index; i < nums.size(); i++) { ksum } return res; } vector<vector<int>> ksum(vector<int> nums, int target, int k) { vector<vector<int>> res; vector<int> temp; sort(nums); for (int i = 0; i < nums.size(); i++) { temp = ksum2(nums, target, k , i); if (temp.size() == k) res.push_back(temp); } return res; } ``` ::: ::: ------------------------- ## Tristina [991. Broken Calculator](https://leetcode.com/problems/broken-calculator/) :::info *2 or -1 startValue -> target 2 -> *2 -> -1 -> 3 =>2 5 -> -1 -> *2 -> 8 =>2 1 <= x, y <= 10^9 startVale < target x<y (x+a)*2^n+b = y 5 6 5 4 3 6 // + 1. target //2 6//2 3< startValue# when we find the closest smaller value -> count the distance (3-5) 2. target cannot divide by 2-> 2-> 5 2 4 3 6 5 5+1 6//2 3+1 4//2 2 ::: ``` python= 5 -> -1 -> *2 -> 8 5 -> 5 target = 3 startValue = 5 count = 2 50 52 26 50 26 52 51 O(n/2) def countStepToTarget(startValue:int, target:int)-> int: count =0 while startValue != target: if target%2==0 and target > startValue: # target can divided by 2 target = target//2 else: target +=1 count +=1 return count ``` -------------------------- # 4/9 ## Willy [1293. Shortest Path in a Grid with Obstacles Elimination](https://leetcode.com/problems/shortest-path-in-a-grid-with-obstacles-elimination/) :::info [2115. Find All Possible Recipes from Given Supplies](https://leetcode.com/problems/shortest-path-in-a-grid-with-obstacles-elimination/) Input: recipes = ["bread"], ingredients = [["yeast","flour"]], supplies = ["yeast","flour","corn"] Output: ["bread"] Input: recipes = ["bread","sandwich"], ingredients = [["yeast","flour"],["bread","meat"]], supplies = ["yeast","flour","meat"] Output: ["bread","sandwich"] Input: grid = [ [0,0,0], [1,1,0], [0,0,0], [0,1,1], [0,0,0]], k = 1 Output: 6 (length) visited = (position,len,k) ::: ```c++= int bfs(vector<vector<int>> grid, int k, int i, int j, int x_size, int y_size) { queue<vector<int>> record; vector<int> root; //record: x, y, count, k root.push_back(i); root.push_back(j); root.push_back(0); root.push_back(k); record.push_back(root); while (!record.empty()) { vector<int> cur = record.front(); vector<int> next_right; vector<int> next_left; vector<int> next_up; vector<int> next_down; if (x_size - 1 == cur[0] && y_size - 1 == cur[1]) break; if (cur[0] + 1 < x_size) { if (grid[cur[0]][cur[1]] == 1 && cur[3] > 0) { cur[3]--; next_right.push_back(cur[0] + 1); next_right.push_back(cur[1]); next_right.push_back(cur[2] + 1); next_right.push_back(cur[3]); record.push(next_right); } else (grid[cur[0]][cur[1]] == 0) { next_right.push_back(cur[0] + 1); next_right.push_back(cur[1]); next_right.push_back(cur[2] + 1); next_right.push_back(cur[3]); record.push(next_right); } } if (cur[0] - 1 >= 0) { if (grid[cur[0]][cur[1]] == 1 && cur[3] > 0) { cur[3]--; next_left.push_back(cur[0] - 1); next_left.push_back(cur[1]); next_left.push_back(cur[2] + 1); next_left.push_back(cur[3]); record.push(next_left); } else (grid[cur[0]][cur[1]] == 0) { next_left.push_back(cur[0] - 1); next_left.push_back(cur[1]); next_left.push_back(cur[2] + 1); next_left.push_back(cur[3]); record.push(next_left); } } if (cur[1] + 1 < y_size) { if (grid[cur[0]][cur[1]] == 1 && cur[3] > 0) { cur[3]--; next_down.push_back(cur[0]); next_down.push_back(cur[1] + 1); next_down.push_back(cur[2] + 1); next_down.push_back(cur[3]); record.push(next_down); } else (grid[cur[0]][cur[1]] == 0) { next_down.push_back(cur[0]); next_down.push_back(cur[1] + 1); next_down.push_back(cur[2] + 1); next_down.push_back(cur[3]); record.push(next_down); } } if (cur[1] - 1 >= 0) { if (grid[cur[0]][cur[1]] == 1 && cur[3] > 0) { cur[3]--; next_up.push_back(cur[0]); next_up.push_back(cur[1] - 1); next_up.push_back(cur[2] + 1); next_up.push_back(cur[3]); record.push(next_up); } else (grid[cur[0]][cur[1]] == 0) { next_up.push_back(cur[0]); next_up.push_back(cur[1] - 1); next_up.push_back(cur[2] + 1); next_up.push_back(cur[3]); record.push(next_up); } } record.pop(); } return cur[2]; } int findshortpath(vector<vector<int>> grid, int k) { int length = INT_MAX; } ``` ------------------------- ## Tristina [287. Find the Duplicate Number](https://leetcode.com/problems/find-the-duplicate-number/) :::info Floyd Cycle size = 5 (n + 1) 1 ~ n nums = [1,3,4,2,2] ^ ^ [1,3,4,2,2] f s nums[0] : 1 nums[1] : 3 nums[3] : 2 nums[2] : 4 nums[4] : 2 1 -> 3 -> 2 -> 4 | <- \ [1,2,3,4,2] Output: 2 O(n)/O(1) for loop go through every num if num not in set: set.add(num) else: return num ::: ``` python= nums = [1,3,3,2,2] num = 3 tmp_num = 4 def returnDuplicate(nums: List[int])-> int: #for i, num in enumerate(nums): N = len(nums) i = 0 tmp_num = 0 while i < len(N) or tmp_num != 0: tmp_num ==0 num = nums[i] if tmp_num ==0: tmp_num = nums[num-1] if tmp_num == num and num-1 != i: return num else: nums[num-1] = num ``` -------------------------- # Template ## Willy []() :::info ::: ```c++= ``` ::: ::: ------------------------- ## Tristina []() :::info ::: ``` python= ```https://hackmd.io/kweY9uS_QmqfDkZVxkLnaw?both#