230. The K-th smallest element in the binary search tree
One question per day on October 17, 2021
Title Description
Given the root node root of a binary search tree and an integer k, please design an algorithm to find the K smallest element (counting from 1).
Example 1:
Input: root = [3,1,4,null,2], k = 1
Output: 1
Example 2:
Input: root = [5,3,6,2,4,null,null,1], k = 3
Output: 3
Tips:
The number of nodes in the tree is n.
1 <= k <= n <= 10^4
0 <= Node.val <= 10^4
Advanced: if the binary search tree is often modified (insert / delete operations) and you need to frequently find the k-th smallest value, how will you optimize the algorithm?
Source: LeetCode
Link: https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
The copyright belongs to Lingkou network. For commercial reprint, please contact the official authorization, and for non-commercial reprint, please indicate the source.
thinking
Because it is a binary search tree, the middle order traversal is arranged from small to large, so the middle order traversal is OK
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { int k; TreeNode t = null; public int kthSmallest(TreeNode root, int k) { //The k-th is the k-th from small to large //Is the k-th node traversed in the middle order this.k = k; inorder(root); return t.val; } public void inorder(TreeNode node){ if(node == null) return; if(t != null) return; inorder(node.left); if(--k == 0) t = node; inorder(node.right); } }
Iterative writing
class Solution { public int kthSmallest(TreeNode root, int k) { //Write an iterative writing method of medium order traversal Stack<TreeNode> stack = new Stack<>(); while(root != null || !stack.isEmpty()){ while(root != null){ stack.push(root); root = root.left; } root = stack.pop(); if(--k == 0) return root.val; root = root.right; } return root.val; } }
476. Complement of numbers
One question per day on October 18, 2021
Title Description
The complement of the integer can be obtained by inverting the binary representation of the integer (0 to 1, 1 to 0) and converting it to decimal representation.
For example, the binary representation of integer 5 is "101", which is reversed to get "010", and then turned back to the decimal representation to get complement 2.
Give you an integer num and output its complement.
Example 1:
Input: num = 5
Output: 2
Explanation: the binary representation of 5 is 101 (without leading zero), and its complement is 010. So you need to output 2.
Example 2:
Input: num = 1
Output: 0
Explanation: the binary representation of 1 is 1 (without leading zero), and its complement is 0. So you need to output 0.
Tips:
1 <= num < 2^31
Source: LeetCode
Link: https://leetcode-cn.com/problems/number-complement
The copyright belongs to Lingkou network. For commercial reprint, please contact the official authorization, and for non-commercial reprint, please indicate the source.
thinking
First find out how many digits this number has, and then negate each digit
class Solution { public int findComplement(int num) { //First find out how many people there are, and then take the opposite one by one int n = 0; while((1 << n) < num){ n++; if(n == 31) break; } int res = 0; for(int i = 1; i <= n; i++){ res = (res << 1) + (((num >> (n - i)) & 1) ^ 1); } return res; } }
The reverse operation here can be the exclusive or of num and mask
mask is num, and all bits are 1, which can also achieve the effect. Because of this XOR, the original 0 will become 1, and the original 1 will become 0
In sister Sanye's method, first operate lowbit, that is, subtract one position at a time to find the highest 1. Assuming that it is x, then x-1 is that all bits except the highest are 1; Then you can use the XOR method, or you can use the inverse and then the sum method like sister Sanye
class Solution { public int findComplement(int num) { int x = 0; for(int i = num; i != 0; i -= i & (-i)) x = i; //Take inverse and return (x - 1) & ~num; //return (x - 1) ^ (num - x); } }
211. Add and search words - data structure design
One question per day on October 19, 2021
Title Description
Please design a data structure that supports adding new words and finding whether the string matches any previously added string.
Implement the dictionary class WordDictionary:
WordDictionary() initializes the dictionary object
void addWord(word) adds word to the data structure, which can then be matched
bool search(word) returns true if there is a string matching word in the data structure; Otherwise, false is returned. Word may contain some '.', and each. Can represent any letter.
Example:
Input:
["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
[[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b..."]]
Output:
[null,null,null,null,false,true,true,true]
Explanation:
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord("bad");
wordDictionary.addWord("dad");
wordDictionary.addWord("mad");
wordDictionary.search("pad"); // return False
wordDictionary.search("bad"); // return True
wordDictionary.search(".ad"); // return True
wordDictionary.search("b..."); // return True
Tips:
1 <= word.length <= 500
word in addWord consists of lowercase English letters
word in search consists of '.' or lowercase English letters
addWord and search can be called up to 50000 times
Source: LeetCode
Link: https://leetcode-cn.com/problems/design-add-and-search-words-data-structure
The copyright belongs to Lingkou network. For commercial reprint, please contact the official authorization, and for non-commercial reprint, please indicate the source.
thinking
Dictionary tree plus depth first search, because there is a little
class WordDictionary { //Write it yourself private boolean isEnd; private WordDictionary[] next; public WordDictionary() { isEnd = false; next = new WordDictionary[26]; } public void addWord(String word) { WordDictionary wd = this; int l = word.length(); for(int i = 0; i < l; i++){ int t = word.charAt(i) - 'a'; if(wd.next[t] == null) wd.next[t] = new WordDictionary(); wd = wd.next[t]; } wd.isEnd = true; } public boolean search(String word) { //Think about how to deal with it WordDictionary wd = this; int l = word.length(); return dfs(wd, word, 0); } public boolean dfs(WordDictionary wd, String word, int idx){ if(wd == null) return false; if(idx == word.length() && wd.isEnd) return true; if(idx == word.length()) return false; char c = word.charAt(idx); if(c != '.'){ if(wd.next[c - 'a'] == null) return false; else return dfs(wd.next[c - 'a'], word, idx + 1); }else{ for(int i = 0; i < 26; i++){ if(dfs(wd.next[i], word, idx + 1)) return true; } return false; } } } /** * Your WordDictionary object will be instantiated and called as such: * WordDictionary obj = new WordDictionary(); * obj.addWord(word); * boolean param_2 = obj.search(word); */