diff --git a/README.md b/README.md
index 2d866fc..c34ae3b 100644
--- a/README.md
+++ b/README.md
@@ -166,6 +166,7 @@ I'm currently working on [Analytics-Zoo](https://github.com/intel-analytics/anal
| 482 | [License Key Formatting](https://leetcode.com/problems/license-key-formatting/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/482_License_Key_Formatting.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/482_License_Key_Formatting.java) | String processing, lower and len % K, O(n) and O(n) |
| 485 | [Max Consecutive Ones](https://leetcode.com/problems/max-consecutive-ones/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/485_Max_Consecutive_Ones.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/485_Max_Consecutive_Ones.java) | Add one when encounter 1, set to 0 when encounter 0, O(n) and O(1) |
| 509 | [Fibonacci Number](https://leetcode.com/problems/fibonacci-number/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/509_Fibonacci_Number.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/509_Fibonacci_Number.java) | 1. Recursive, O(n)
2. DP with memo, O(n). Note that N<=30, which means that we can keep a memo from 0 to 30. |
+| 523 | [Continuous Subarray Sum](https://leetcode.com/problems/continuous-subarray-sum/description/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/523_Continuous_Subarray_Sum.py) | O(n) solution using dict() |
| 538 | [Convert BST to Greater Tree](https://leetcode.com/problems/convert-bst-to-greater-tree/description/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/538_Convert_BST_to_Greater_Tree.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/538_Convert_BST_to_Greater_Tree.java) | Right first DFS with a variable recording sum of node.val and right.val. 1. Recursive.
2. Stack 3. Reverse Morris In-order Traversal |
| 541 | [Reverse String II](https://leetcode.com/problems/reverse-string-ii/solution/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/541_Reverse_String_II.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/541_Reverse_String_II.java) | Handle each 2k until reaching end, On(n) and O(n) |
| 543 | [Diameter of Binary Tree](https://leetcode.com/problems/diameter-of-binary-tree/description/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/543_Diameter_of_Binary_Tree.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/543_Diameter_of_Binary_Tree.java) | DFS with O(1) for max answer |
@@ -242,7 +243,11 @@ I'm currently working on [Analytics-Zoo](https://github.com/intel-analytics/anal
| 1365 | [How Many Numbers Are Smaller Than the Current Number](https://leetcode.com/problems/how-many-numbers-are-smaller-than-the-current-number/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/1365_How_Many_Numbers_Are_Smaller_Than_the_Current_Number.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/1365_How_Many_Numbers_Are_Smaller_Than_the_Current_Number.java) | 1. Sort and get position in sorted nums, O(nlogn) and O(n)
2. Fill count into 0-100, O(n) and O(1) |
| 1480 | [Running Sum of 1d Array](https://leetcode.com/problems/running-sum-of-1d-array/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/1480_Running_Sum_of_1d_Array.py) [Java](https://github.com/qiyuangong/leetcode/blob/master/java/1480_Running_Sum_of_1d_Array.java) | 1. Go through the array, O(n) and O(1)
2. Accumulate API |
| 1539 | [Kth Missing Positive Number](https://leetcode.com/problems/kth-missing-positive-number/) | [Java](https://github.com/qiyuangong/leetcode/blob/master/java/1539_Kth_Missing_Positive_Number.java) | Binary search, num of missing = arr[i]-i-1 |
+| 1909 | [Remove One Element to Make the Array Strictly Increasing](https://leetcode.com/problems/remove-one-element-to-make-the-array-strictly-increasing/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/1909_Remove_One_Element_to_Make_the_Array_Strictly_Increasing.py )| Use brute-force. O( (nums.length)2) |
| 1981 | [Minimize the Difference Between Target and Chosen Elements](https://leetcode.com/problems/minimize-the-difference-between-target-and-chosen-elements/) | [Java](https://github.com/qiyuangong/leetcode/blob/master/java/1981_Minimize_the_Difference_Between_Target_and_Chosen_Elements.java) | DP memo[row][sum] to avoid recomputing |
+| 2409 | [Count Days Spent Together](https://leetcode.com/problems/count-days-spent-together/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/2409_Count_Days_Spent_Together.py)| Use month as a day |
+| 2413 | [Smallest Even Multiple](https://leetcode.com/problems/smallest-even-multiple/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/2413_Smallest_Even_Multiple.py)| Check the n is multiply by 2 |
+| 2429 | [Minimize XOR](https://leetcode.com/problems/minimize-xor/) | [Python](https://github.com/qiyuangong/leetcode/blob/master/python/2429_Minimize_XOR.py.py) | check the num1, num2 with length and replace "0" compare with num1. |
| # | To Understand |
|---| ----- |
diff --git a/cpp/2553_Separate_the_Digits_in_an_Array.cpp b/cpp/2553_Separate_the_Digits_in_an_Array.cpp
new file mode 100644
index 0000000..e88e8c6
--- /dev/null
+++ b/cpp/2553_Separate_the_Digits_in_an_Array.cpp
@@ -0,0 +1,19 @@
+class Solution {
+public:
+ vector separateDigits(vector& nums) {
+ vector answer;
+ int n;
+ for( int i=0; i < nums.size(); i++){
+ n=nums[i];
+ vector temp;
+ while( n>0 ){
+ temp.push_back(n%10);
+ n = n / 10;
+ }
+ for(int j= temp.size()-1; j>=0; j--){
+ answer.push_back(temp[j]);
+ }
+ }
+ return answer;
+ }
+};
diff --git a/java/006_ZigZag_Conversion.java b/java/006_ZigZag_Conversion.java
index ea64188..97e4b1a 100644
--- a/java/006_ZigZag_Conversion.java
+++ b/java/006_ZigZag_Conversion.java
@@ -1 +1,33 @@
-//TODO
\ No newline at end of file
+//006_ZigZag_Conversion.java
+class Solution {
+ public String convert(String s, int numRows) {
+ if(numRows==1) {
+ return s;
+ }
+
+ String answer = "";
+ String[] str_array = new String[numRows];
+
+ for(int i=0;i= numRows) {
+ index = 2*(numRows-1) - index;
+ }
+ str_array[index]+=c;
+ }
+
+ for(int i=0;i=strs[i].length()){
+ check = false;
+ break;
+ }
+ if(i==0){ //temp -> check same Character
+ temp = Character.toString(strs[0].charAt(c));
+ }
+ if(!temp.equals(Character.toString(strs[i].charAt(c)))){
+ check = false;
+ break;
+ }
+ if(i==strs.length-1){
+ result += temp;
+ }
+ }
+ if(!check){
+ break;
+ }
+ c++;
+ }
+ return result;
+
+ }
+}
\ No newline at end of file
diff --git a/java/015_3Sum.java b/java/015_3Sum.java
new file mode 100644
index 0000000..cc0a069
--- /dev/null
+++ b/java/015_3Sum.java
@@ -0,0 +1,47 @@
+//015. 3Sum
+class Solution {
+ public List> threeSum(int[] nums) {
+ //create result list to store i,j,k
+ List> result = new LinkedList>();
+
+ //sorting nums
+ Arrays.sort(nums);
+
+ for (int i = 0; i < nums.length - 2; i++) {
+
+ int left = i + 1;
+ int right = nums.length - 1;
+
+ if (i > 0 && nums[i] == nums[i-1]) {
+ continue; //if nums have same numbers, just check one time.
+ }
+
+ while (left < right) {
+ int sum = nums[left] + nums[right] + nums[i];
+
+ if (sum == 0) {
+ //if sum == 0, store i,j,k
+ result.add(Arrays.asList(nums[i], nums[left], nums[right]));
+ left++; //check anoter case
+ right--;
+ //if next number == now number
+ while (nums[left] == nums[left - 1] && left < right) {
+ left++;
+ }
+ while (nums[right] == nums[right + 1] && left < right) {
+ right--;
+ }
+ } else if (sum > 0) {
+ //if sum > 0, right--;
+ right--;
+ } else {
+ //if sum < 0, left++;
+ left++;
+ }
+ }
+ }
+
+ return result; //return result list
+ }
+}
+
diff --git a/java/026_Remove_Duplicates_from_Sorted_Array.java b/java/026_Remove_Duplicates_from_Sorted_Array.java
new file mode 100644
index 0000000..13f03b1
--- /dev/null
+++ b/java/026_Remove_Duplicates_from_Sorted_Array.java
@@ -0,0 +1,16 @@
+//026. Remove Duplicates from Sorted Array
+class Solution {
+ public int removeDuplicates(int[] nums) {
+ int index = 1;
+
+ for (int i = 0; i < nums.length - 1; i++) {
+ if (nums[i] != nums[i + 1]) {
+ nums[index] = nums[i + 1];
+ index++;
+ }
+ }
+
+ return index;
+ }
+}
+
diff --git a/java/034_Find_First_and_Last_Position_of_Element_in_Sorted_Array.java b/java/034_Find_First_and_Last_Position_of_Element_in_Sorted_Array.java
new file mode 100644
index 0000000..01a70a7
--- /dev/null
+++ b/java/034_Find_First_and_Last_Position_of_Element_in_Sorted_Array.java
@@ -0,0 +1,59 @@
+class Solution {
+ /*
+ Rule 1
+ - Given array is sorted in non-decreasing order
+
+ Rule 2
+ - Limit time complexity O(log n).
+
+ So I can use Binary Search Algorithm.
+ */
+ public int[] searchRange(int[] nums, int target) {
+ // initialize arr[0] -> maximum integer, arr[1] -> minimum integer
+ int[] arr = {100001, -10};
+ int s = 0;
+ int e = nums.length - 1;
+
+ // find minimum index in nums with Binary Search alogorithm
+ while (s <= e) {
+
+ int mid = (s + e) / 2;
+
+ if(nums[mid] > target) {
+ e = mid - 1;
+ }
+ else if(nums[mid] <= target) {
+ if(nums[mid] == target) {
+ arr[0] = Math.min(arr[0], mid);
+ arr[1] = Math.max(arr[1], mid);
+ }
+ s = mid + 1;
+ }
+ }
+
+ s = 0;
+ e = nums.length - 1;
+
+ // find maximum index in nums with Binary Search alogorithm
+ while(s <= e) {
+ int mid = (s + e) / 2;
+
+ if(nums[mid] >= target) {
+ if(nums[mid] == target) {
+ arr[0] = Math.min(arr[0], mid);
+ arr[1] = Math.max(arr[1], mid);
+ }
+ e = mid - 1;
+ }
+ else if(nums[mid] < target) {
+ s = mid + 1;
+ }
+ }
+
+ // if arr data is initial data, set -1.
+ if(arr[0] == 100001) arr[0] = -1;
+ if(arr[1] == -10) arr[1] = -1;
+
+ return arr;
+ }
+}
diff --git a/java/039_Combination_Sum.java b/java/039_Combination_Sum.java
new file mode 100644
index 0000000..7a54dd3
--- /dev/null
+++ b/java/039_Combination_Sum.java
@@ -0,0 +1,29 @@
+//039_Combination_Sum
+class Solution {
+ List> answer = new ArrayList>();
+
+ public List> combinationSum(int[] candidates, int target) {
+ int clen =candidates.length;
+ for (int i = 0; i < clen; i++) {
+ List tlist = new ArrayList();
+ tlist.add(candidates[i]);
+ backtracking(candidates, i, 1, (target - candidates[i]), tlist);
+ }
+ return answer;
+ }
+ private void backtracking(int[] candidates, int index, int tsize, int target, List temp) {
+ if (target == 0) {
+ answer.add(new ArrayList(temp));
+ return;
+ }
+
+ for (int i = index, len = candidates.length; i < len; i++) {
+ if (candidates[i] <= target) {
+ temp.add(candidates[i]);
+ backtracking(candidates, i, (tsize + 1), (target - candidates[i]), temp);
+ temp.remove(tsize);
+ }
+ }
+ }
+}
+
diff --git a/java/049_Group_Anagrams.java b/java/049_Group_Anagrams.java
new file mode 100644
index 0000000..a787625
--- /dev/null
+++ b/java/049_Group_Anagrams.java
@@ -0,0 +1,42 @@
+class Solution {
+ public List> groupAnagrams(String[] strs) {
+ int[][] alphabets = new int[strs.length]['z' - 'a' + 1];
+
+ for(int i = 0; i < strs.length; i++) {
+ String str = strs[i];
+
+ for(int j = 0; j < str.length(); j++)
+ alphabets[i][str.charAt(j) - 'a']++;
+ }
+
+ boolean[] visited = new boolean[strs.length];
+
+ List> answer = new ArrayList<>();
+
+ for(int i = 0; i < strs.length; i++) {
+ if(visited[i]) continue;
+
+ List list = new ArrayList<>();
+
+ for(int j = i; j < strs.length; j++) {
+ if(visited[j]) continue;
+ if(isAnagram(alphabets[i], alphabets[j])) {
+ list.add(strs[j]);
+ visited[j] = true;
+ }
+ }
+
+ answer.add(list);
+ }
+
+ return answer;
+ }
+
+ public boolean isAnagram(int[] arr1, int[] arr2) {
+ for(int i = 0; i < arr1.length; i++) {
+ if(arr1[i] != arr2[i])
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/java/055_Jump_Game.java b/java/055_Jump_Game.java
new file mode 100644
index 0000000..50971d4
--- /dev/null
+++ b/java/055_Jump_Game.java
@@ -0,0 +1,49 @@
+import java.util.*;
+
+class Solution {
+ public boolean canJump(int[] nums) {
+ /*
+ * Constraints
+ * 1 <= nums.length <= 10^4
+ * 0 <= nums[i] <= 10^5
+ *
+ * Solution
+ * 1. Use BFS Algorithm.
+ * - reason 1 : have to ignore array which is not visited.
+ * - reason 2 : we have to visit all possible array from array[start].
+ */
+
+ int N = nums.length;
+ ArrayDeque q = new ArrayDeque<>();
+ boolean[] visited = new boolean[N];
+
+ // First, add first array index.
+ // And, set visited[first_index] to true.
+ q.add(0);
+ visited[0] = true;
+
+ // Axiom : if N is 1, result is true.
+ if(N == 1) return true;
+
+ // BFS algorithm
+ while(!q.isEmpty()) {
+ int cur = q.poll();
+
+ // find cur + 1 to cur + nums[cur]
+ for(int i = 1; i <= nums[cur]; i++) {
+ if(cur + i >= N - 1) return true;
+ int next = Math.min(cur + i, N - 1);
+
+ // set visited[next] to true and add index into queue.
+ // because of time limit(No overlap steps.)
+ if(!visited[next]) {
+ visited[next] = true;
+ q.add(next);
+ }
+ }
+ }
+
+ return false;
+
+ }
+}
\ No newline at end of file
diff --git a/java/088_Merge_Sorted_Array.java b/java/088_Merge_Sorted_Array.java
new file mode 100644
index 0000000..95c7c8e
--- /dev/null
+++ b/java/088_Merge_Sorted_Array.java
@@ -0,0 +1,29 @@
+class Solution {
+ //we are being given two int arrays and two int variables that state the number of elements in each array, respectively
+ public void merge(int[] nums1, int m, int[] nums2, int n) {
+ //I am using a counter so that I can iterate through the second array inside the for loop
+ int counter = 0;
+ //We know that nums1 is of the size n + m, so we can add all the elements to the array and sort them later
+ //For loop adds all values of nums2 to the end of nums1
+ for(int i=m; i nums1[j+1]){
+ int temp = nums1[j+1];
+ nums1[j+1] = nums1[j];
+ nums1[j] = temp;
+ }
+ }
+ }
+ //The following function simply prints out everything that is contained within our num1 array
+ for(int i=0; i list = new ArrayList<>();
+ // make array for get phone number's characters.
+ public char[][] arr = {
+ {'0', '0', '0', '-'},
+ {'0', '0', '0', '-'},
+ {'a', 'b', 'c', '-'},
+ {'d', 'e', 'f', '-'},
+ {'g', 'h', 'i', '-'},
+ {'j', 'k', 'l', '-'},
+ {'m', 'n', 'o', '-'},
+ {'p', 'q', 'r', 's'},
+ {'t', 'u', 'v', '-'},
+ {'w', 'x', 'y', 'z'},
+ };
+
+ // main function
+ public List letterCombinations(String digits) {
+ addString(digits, 0, "");
+ return list;
+ }
+
+ // axiom : if input == "", return []
+ // if index == digits.length(), add str in list
+ // else do loop number's character, and function recursion.
+ public void addString(String digits, int index, String str) {
+ if(digits.equals("")) return;
+ if(index == digits.length()) {
+ list.add(str);
+ }
+ else {
+ for(int i = 0; i < 4; i++) {
+ int number = Integer.parseInt(digits.charAt(index) + "");
+ if(arr[number][i] == '-') continue;
+ addString(digits, index + 1, str + arr[number][i]);
+ }
+ }
+ }
+}
diff --git a/java/219_Contains_Duplicate_II.java b/java/219_Contains_Duplicate_II.java
new file mode 100644
index 0000000..f88a1a9
--- /dev/null
+++ b/java/219_Contains_Duplicate_II.java
@@ -0,0 +1,44 @@
+import java.util.*;
+
+class Solution {
+ /*
+ * I have to save indice for each index.
+ * So I use the HashMap>
+ */
+
+ public boolean containsNearbyDuplicate(int[] nums, int k) {
+ HashMap> map = new HashMap<>();
+
+ for(int i = 0; i < nums.length; i++) {
+ if(!map.containsKey(nums[i])) {
+ map.put(nums[i], new ArrayList<>());
+ }
+ map.get(nums[i]).add(i);
+ }
+
+ // use Iterator to find appropriate two indice.
+ // Each list guarantee ascending.
+ // So list.get(i) and list.get(i + 1) is minimum.
+ Iterator keys = map.keySet().iterator();
+ boolean answer = false;
+
+ while(keys.hasNext()) {
+ int key = keys.next();
+ List list = map.get(key);
+
+ if(list.size() < 2) continue;
+
+ for(int i = 1; i < list.size(); i++) {
+ int a = list.get(i - 1);
+ int b = list.get(i);
+
+ if(b - a <= k) {
+ answer = true;
+ break;
+ }
+ }
+ if(answer) break;
+ }
+ return answer;
+ }
+}
diff --git a/java/22_Generate_Parentheses.java b/java/22_Generate_Parentheses.java
new file mode 100644
index 0000000..1667c87
--- /dev/null
+++ b/java/22_Generate_Parentheses.java
@@ -0,0 +1,26 @@
+class Solution {
+ // main function
+ public List generateParenthesis(int n) {
+ ArrayList list = new ArrayList<>();
+ rec(list, "(", n - 1, n);
+ return list;
+ }
+
+ // axiom : if start == end == 0, add str in list.
+ // IDEA :
+ // In well-formed parentheses
+ // close character(")") has to be bigger than open character("(")
+ // So, we can solve this problem with recursion.
+ public void rec(List list, String str, int start, int end) {
+ if(start == 0 && end == 0) {
+ list.add(str);
+ }
+
+ if(start > 0) {
+ rec(list, str + "(", start - 1, end);
+ }
+ if(end > start) {
+ rec(list, str + ")", start, end - 1);
+ }
+ }
+}
diff --git a/java/442_Find_All_Duplicates_in_an_Array.java b/java/442_Find_All_Duplicates_in_an_Array.java
new file mode 100644
index 0000000..b12d6f5
--- /dev/null
+++ b/java/442_Find_All_Duplicates_in_an_Array.java
@@ -0,0 +1,17 @@
+class Solution {
+ public List findDuplicates(int[] nums) {
+ int n = nums.length;
+
+ List ans = new ArrayList<>();
+
+ for(int i=0;i max_int:
- # result = 0
- # if isPos:
- # return result
- # else:
- # return -1 * result
+# if flag:
+# x = "-" + x
- def reverse(self, x):
- # Note that in Python -1 / 10 = -1
- res, isPos = 0, 1
+# value = 2 ** 31
+# x = int(x)
+# if -value <= x < value:
+# return x
+# return 0
+
+ is_neg = False
if x < 0:
- isPos = -1
- x = -1 * x
- while x != 0:
- res = res * 10 + x % 10
- if res > 2147483647:
- return 0
- x /= 10
- return res * isPos
\ No newline at end of file
+ x = -x
+ is_neg = True
+
+ res = 0
+ while x > 0:
+ res *= 10
+ res += x % 10
+ x //= 10
+ if is_neg:
+ res = -res
+
+ if res < -2**31 or res > 2**31-1:
+ return 0
+ return res
+
\ No newline at end of file
diff --git a/python/1909_Remove_One_Element_to_Make_the_Array_Strictly_Increasing.py b/python/1909_Remove_One_Element_to_Make_the_Array_Strictly_Increasing.py
new file mode 100644
index 0000000..5ae5c6f
--- /dev/null
+++ b/python/1909_Remove_One_Element_to_Make_the_Array_Strictly_Increasing.py
@@ -0,0 +1,37 @@
+class Solution:
+ def canBeIncreasing(self, nums: List[int]) -> bool:
+ # bruteforcing the whole idxes.
+ canBe = [0] * len(nums)
+
+ # choosing the idx that will be removed.
+ for bannedIdx in range(len(nums)):
+ Flag = 1
+
+ # if the bannedIdx is 0 than the startIdx will be 2.
+ # when bannedIdx is 0, idx 2 is the first element that has a previous element.
+ # In other cases, idx 1 is the one.
+ for i in range(1 if bannedIdx != 0 else 2, len(nums)):
+ # if i is bannedIdx than just skip it.
+ if i == bannedIdx:
+ continue
+
+ # if the previous element is banned.
+ # compare [i] with [i - 2]
+ if i - 1 == bannedIdx:
+ if nums[i] <= nums[i - 2]:
+ Flag = 0
+ break
+ continue
+
+ # compare [i] with [i - 1]
+ if nums[i] <= nums[i - 1]:
+ Flag = 0
+ break
+
+ # end of loop we will get Flag that has a 0 or 1 value.
+ canBe[bannedIdx] = Flag
+
+ if sum(canBe) > 0:
+ return True
+ return False
+
diff --git a/python/2409_Count_Days_Spent_Together.py b/python/2409_Count_Days_Spent_Together.py
new file mode 100644
index 0000000..13747f1
--- /dev/null
+++ b/python/2409_Count_Days_Spent_Together.py
@@ -0,0 +1,38 @@
+class Solution:
+ def countDaysTogether(self, arriveAlice: str, leaveAlice: str, arriveBob: str, leaveBob: str) -> int:
+ # split the dates to month and day.
+ arriveAliceMonth, arriveAliceDay = map(int, arriveAlice.split("-"))
+ leaveAliceMonth, leaveAliceDay = map(int, leaveAlice.split("-"))
+ arriveBobMonth, arriveBobDay = map(int, arriveBob.split("-"))
+ leaveBobMonth, leaveBobDay = map(int, leaveBob.split("-"))
+
+ # prefixOfCalendar : initialize the calendar and in the past we will use this to convert month to day, index is 1 - based
+ # spentTogether, aliceSpent : work as cache list. and index is 1 - based
+ calendar = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
+ prefixOfCalendar = [0] * 13
+ totalDates = sum(calendar)
+ spentTogether, aliceSpent = [0] * (totalDates + 1), [0] * (totalDates + 1)
+
+ # calculate the prefix of calendar
+ for i in range(1, len(calendar)):
+ prefixOfCalendar[i] = prefixOfCalendar[i - 1] + calendar[i]
+
+ # if the string is "01-15", it can be treat as 15 days.
+ # if the string is "02-27", it can be treat as 58 days.
+ # So, it can be "prefixOfCalendar[month - 1] + day"
+ # and in the problem it includes the leaveDate so +1 need to be in .
+ arriveAliceTotal = prefixOfCalendar[arriveAliceMonth - 1] + arriveAliceDay
+ leaveAliceTotal = prefixOfCalendar[leaveAliceMonth - 1] + leaveAliceDay
+ for i in range(arriveAliceTotal, leaveAliceTotal + 1):
+ aliceSpent[i] += 1
+
+ # check the aliceSpent[i] is True.
+ # if it is, they spentTogether is True too.
+ arriveBobTotal = prefixOfCalendar[arriveBobMonth - 1] + arriveBobDay
+ leaveBobTotal = prefixOfCalendar[leaveBobMonth - 1] + leaveBobDay
+ for i in range(arriveBobTotal, leaveBobTotal + 1):
+ if aliceSpent[i]:
+ spentTogether[i] += 1
+
+ # I used list because of this sum function.
+ return sum(spentTogether)
diff --git a/python/2413_Smallest_Even_Multiple.py b/python/2413_Smallest_Even_Multiple.py
new file mode 100644
index 0000000..02b723f
--- /dev/null
+++ b/python/2413_Smallest_Even_Multiple.py
@@ -0,0 +1,15 @@
+class Solution:
+ def smallestEvenMultiple(self, n: int) -> int:
+ """
+ n : positive integer
+ return : smallest positive integer that is a multiple of both 2 and n
+ """
+ if n % 2 == 0:
+ # if n is alreay muliply by 2
+ # return itself
+ return n
+
+ # if previous condition is false
+ # n * 2 is the smallest positive integer.
+ return n * 2
+
diff --git a/python/2420_Find_All_Good_Indices.py b/python/2420_Find_All_Good_Indices.py
new file mode 100644
index 0000000..44498cc
--- /dev/null
+++ b/python/2420_Find_All_Good_Indices.py
@@ -0,0 +1,38 @@
+#2420_Find_All_Good_Indices.py
+class Solution:
+ def goodIndices(self, nums: List[int], k: int) -> List[int]:
+ # posi : count the increasing idxes
+ # nega : count the decreasing idxes
+ posi, nega = [0], [0]
+
+ for i in range(1, len(nums)):
+ diff = nums[i] - nums[i - 1]
+
+ posi.append(posi[i - 1])
+ nega.append(nega[i - 1])
+
+ # if diff show positive or negative
+ # then the value will updated
+ if diff > 0:
+ posi[i] += 1
+ elif diff < 0:
+ nega[i] += 1
+
+ # ans : count the idxes that
+ # before k element is non increasing
+ # after k element is non decreasing
+ ans = []
+ for i in range(k, len(nums) - k):
+ if i + k >= len(nums):
+ break
+
+ # check the condition with
+ # for after, nega[i + 1], nega[i + k] is the two to check
+ # for brfore, posi[i - 1], posi[i - k] is the two to check
+ if nega[i + k] - nega[i + 1] > 0:
+ continue
+ if posi[i - 1] - posi[i - k] > 0:
+ continue
+
+ ans.append(i)
+ return ans
\ No newline at end of file
diff --git a/python/2429_Minimize_XOR.py b/python/2429_Minimize_XOR.py
new file mode 100644
index 0000000..2405feb
--- /dev/null
+++ b/python/2429_Minimize_XOR.py
@@ -0,0 +1,44 @@
+class Solution:
+ def minimizeXor(self, num1: int, num2: int) -> int:
+ # remove "0b" in front of num1, num2
+ num1, num2 = bin(num1)[2:], bin(num2)[2:]
+ lenNum1, lenNum2 = len(num1), len(num2)
+ ones = num2.count("1")
+ maxLen = max(lenNum1, lenNum2)
+
+ # ans list have elements same as the maxLen
+ ans = []
+ for _ in range(maxLen):
+ ans.append("0")
+
+ # add "0" in front of the binary numbers to make indexing easier
+ for _ in range(maxLen - lenNum1):
+ num1 = "0" + num1
+
+ for _ in range(maxLen - lenNum2):
+ num2 = "0" + num2
+
+ # now make "x XOR num1" minimal
+ # fill the ans list from index "0"
+ # because XOR give 0 when the elements are same.
+ for i in range(len(num1)):
+ if num1[i] == "1" and ones:
+ ans[i] = "1"
+ ones -= 1
+
+ # if we still got "1" to fill in the ans list.
+ # "1" need to be fill from the back of ans list.
+ # to maintain the number small.
+ for i in range(len(ans) - 1, -1, -1):
+ if ones < 1:
+ break
+
+ if ans[i] == "1":
+ continue
+
+ ans[i] = "1"
+ ones -= 1
+
+ # make the ans in string
+ ans = "".join(ans)
+ return int(ans, 2)
diff --git a/python/392_Is_Subsequence.py b/python/392_Is_Subsequence.py
new file mode 100644
index 0000000..5cf66c0
--- /dev/null
+++ b/python/392_Is_Subsequence.py
@@ -0,0 +1,11 @@
+class Solution:
+ def isSubsequence(self, s: str, t: str) -> bool:
+ for a in s:
+ if a in t:
+ for b in range(0, len(t)):
+ if a==t[b]:
+ t=t[b+1:]
+ break
+ else:
+ return(False)
+ return(True)
diff --git a/python/523_Continuous_Subarray_Sum.py b/python/523_Continuous_Subarray_Sum.py
new file mode 100644
index 0000000..d37ceeb
--- /dev/null
+++ b/python/523_Continuous_Subarray_Sum.py
@@ -0,0 +1,20 @@
+class Solution:
+ def checkSubarraySum(self, nums: List[int], k: int) -> bool:
+ # remeainders[0] = 0 is for when x == 0
+ remainders = dict()
+ remainders[0] = 0
+ pre_sum = 0
+
+ for idx, item in enumerate(nums):
+ pre_sum += item
+ remaind = pre_sum % k
+
+ # remainder doesnt exist then it has to be init
+ # if it exists, then check the prev one has the same remainder
+ if remaind not in remainders:
+ remainders[remaind] = idx + 1
+ elif remainders[remaind] < idx:
+ return True
+
+ return False
+
diff --git a/python/732_My_Calendar_III.py b/python/732_My_Calendar_III.py
new file mode 100644
index 0000000..6347108
--- /dev/null
+++ b/python/732_My_Calendar_III.py
@@ -0,0 +1,17 @@
+from sortedcontainers import SortedDict
+
+
+class MyCalendarThree:
+ def __init__(self):
+ self.timeline = SortedDict()
+
+ def book(self, start: int, end: int) -> int:
+ self.timeline[start] = self.timeline.get(start, 0) + 1
+ self.timeline[end] = self.timeline.get(end, 0) - 1
+
+ ans = 0
+ activeEvents = 0
+
+ for count in self.timeline.values():
+ activeEvents += count
+ ans = max(ans, activeEvents)