diff --git a/problems/0106.从中序与后序遍历序列构造二叉树.md b/problems/0106.从中序与后序遍历序列构造二叉树.md index ba2d46a1..600a38e0 100644 --- a/problems/0106.从中序与后序遍历序列构造二叉树.md +++ b/problems/0106.从中序与后序遍历序列构造二叉树.md @@ -693,6 +693,70 @@ class Solution: return root ``` Go: +> 106 从中序与后序遍历序列构造二叉树 + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func buildTree(inorder []int, postorder []int) *TreeNode { + if len(inorder)<1||len(postorder)<1{return nil} + //先找到根节点(后续遍历的最后一个就是根节点) + nodeValue:=postorder[len(postorder)-1] + //从中序遍历中找到一分为二的点,左边为左子树,右边为右子树 + left:=findRootIndex(inorder,nodeValue) + //构造root + root:=&TreeNode{Val: nodeValue, + Left: buildTree(inorder[:left],postorder[:left]),//将后续遍历一分为二,左边为左子树,右边为右子树 + Right: buildTree(inorder[left+1:],postorder[left:len(postorder)-1])} + return root +} +func findRootIndex(inorder []int,target int) (index int){ + for i:=0;i 105 从前序与中序遍历序列构造二叉树 + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func buildTree(preorder []int, inorder []int) *TreeNode { + if len(preorder)<1||len(inorder)<1{return nil} + left:=findRootIndex(preorder[0],inorder) + root:=&TreeNode{ + Val: preorder[0], + Left: buildTree(preorder[1:left+1],inorder[:left]), + Right: buildTree(preorder[left+1:],inorder[left+1:])} + return root +} +func findRootIndex(target int,inorder []int) int{ + for i:=0;i bool: + from collections import defaultdict + + s_dict = defaultdict(int) + t_dict = defaultdict(int) + + for x in s: + s_dict[x] += 1 + + for x in t: + t_dict[x] += 1 + + return s_dict == t_dict +``` + Go: + ```go func isAnagram(s string, t string) bool { if len(s)!=len(t){ diff --git a/problems/0530.二叉搜索树的最小绝对差.md b/problems/0530.二叉搜索树的最小绝对差.md index 03c48d9c..0bbc4908 100644 --- a/problems/0530.二叉搜索树的最小绝对差.md +++ b/problems/0530.二叉搜索树的最小绝对差.md @@ -224,8 +224,37 @@ class Solution: return r ``` Go: +> 中序遍历,然后计算最小差值 - +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func getMinimumDifference(root *TreeNode) int { + var res []int + findMIn(root,&res) + min:=1000000//一个比较大的值 + for i:=1;i 654. 最大二叉树 + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func constructMaximumBinaryTree(nums []int) *TreeNode { + if len(nums)<1{return nil} + //首选找到最大值 + index:=findMax(nums) + //其次构造二叉树 + root:=&TreeNode{ + Val: nums[index], + Left:constructMaximumBinaryTree(nums[:index]),//左半边 + Right:constructMaximumBinaryTree(nums[index+1:]),//右半边 + } + return root +} +func findMax(nums []int) (index int){ + for i:=0;inums[index]{ + index=i + } + } + return +} +``` + diff --git a/problems/0700.二叉搜索树中的搜索.md b/problems/0700.二叉搜索树中的搜索.md index 25a06617..16b21f26 100644 --- a/problems/0700.二叉搜索树中的搜索.md +++ b/problems/0700.二叉搜索树中的搜索.md @@ -241,6 +241,56 @@ class Solution: Go: +> 递归法 + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ + //递归法 +func searchBST(root *TreeNode, val int) *TreeNode { + if root==nil||root.Val==val{ + return root + } + if root.Val>val{ + return searchBST(root.Left,val) + } + return searchBST(root.Right,val) +} +``` + +> 迭代法 + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ + //迭代法 +func searchBST(root *TreeNode, val int) *TreeNode { + for root!=nil{ + if root.Val>val{ + root=root.Left + }else if root.Val= size){return -1;} + ListNode cur = head; + + // 通过判断 index < (size - 1) / 2 来决定是从头结点还是尾节点遍历,提高效率 + if(index < (size - 1) / 2){ + for(int i = 0; i <= index; i++){ + cur = cur.next; + } + }else{ + cur = tail; + for(int i = 0; i <= size - index - 1; i++){ + cur = cur.prev; + } + } + return cur.val; + } + + /** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */ + public void addAtHead(int val) { + ListNode cur = head; + ListNode newNode = new ListNode(val); + newNode.next = cur.next; + cur.next.prev = newNode; + cur.next = newNode; + newNode.prev = cur; + size++; + } + + /** Append a node of value val to the last element of the linked list. */ + public void addAtTail(int val) { + ListNode cur = tail; + ListNode newNode = new ListNode(val); + newNode.next = tail; + newNode.prev = cur.prev; + cur.prev.next = newNode; + cur.prev = newNode; + size++; + } + + /** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */ + public void addAtIndex(int index, int val) { + if(index > size){return;} + if(index < 0){index = 0;} + ListNode cur = head; + for(int i = 0; i < index; i++){ + cur = cur.next; + } + ListNode newNode = new ListNode(val); + newNode.next = cur.next; + cur.next.prev = newNode; + newNode.prev = cur; + cur.next = newNode; + size++; + } + + /** Delete the index-th node in the linked list, if the index is valid. */ + public void deleteAtIndex(int index) { + if(index >= size || index < 0){return;} + ListNode cur = head; + for(int i = 0; i < index; i++){ + cur = cur.next; + } + cur.next.next.prev = cur; + cur.next = cur.next.next; + size--; + } +} + +/** + * Your MyLinkedList object will be instantiated and called as such: + * MyLinkedList obj = new MyLinkedList(); + * int param_1 = obj.get(index); + * obj.addAtHead(val); + * obj.addAtTail(val); + * obj.addAtIndex(index,val); + * obj.deleteAtIndex(index); + */ ``` Python: diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md index 1f91e42a..eeea6ead 100644 --- a/problems/0739.每日温度.md +++ b/problems/0739.每日温度.md @@ -214,6 +214,52 @@ Python: Go: +> 暴力法 + +```go +func dailyTemperatures(temperatures []int) []int { + length:=len(temperatures) + res:=make([]int,length) + for i:=0;i=temperatures[j]{//大于等于 + j++ + } + if j 单调栈法 + +```go +func dailyTemperatures(temperatures []int) []int { + length:=len(temperatures) + res:=make([]int,length) + stack:=[]int{} + for i:=0;i0&&temperatures[i]>temperatures[stack[len(stack)-1]]{ + res[stack[len(stack)-1]]=i-stack[len(stack)-1]//存放结果集 + stack=stack[:len(stack)-1]//删除stack[len(stack)-1]的元素 + } + //如果栈顶元素大于等于新来的元素,则加入到栈中。当栈内元素个数为0时,直接入栈 + if len(stack)==0||temperatures[i]<=temperatures[stack[len(stack)-1]]{ + stack = append(stack, i) + } + } + return res +} +``` diff --git a/problems/0977.有序数组的平方.md b/problems/0977.有序数组的平方.md index d2e1f950..0f9007d7 100644 --- a/problems/0977.有序数组的平方.md +++ b/problems/0977.有序数组的平方.md @@ -198,6 +198,31 @@ impl Solution { } } ``` +Javascript: +```Javascript +/** + * @desc two pointers solution + * @link https://leetcode-cn.com/problems/squares-of-a-sorted-array/ + * @param nums Array e.g. [-4,-1,0,3,10] + * @return {array} e.g. [0,1,9,16,100] + */ +const sortedSquares = function (nums) { + let res = [] + for (let i = 0, j = nums.length - 1; i <= j;) { + const left = Math.abs(nums[i]) + const right = Math.abs(nums[j]) + if (right > left) { + // push element to the front of the array + res.unshift(right * right) + j-- + } else { + res.unshift(left * left) + i++ + } + } + return res + } +``` ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw) diff --git a/problems/背包问题理论基础多重背包.md b/problems/背包问题理论基础多重背包.md index 26890a2b..e14575d4 100644 --- a/problems/背包问题理论基础多重背包.md +++ b/problems/背包问题理论基础多重背包.md @@ -147,9 +147,56 @@ int main() { Java: - Python: +```python +def test_multi_pack1(): + '''版本一:改变物品数量为01背包格式''' + weight = [1, 3, 4] + value = [15, 20, 30] + nums = [2, 3, 2] + bag_weight = 10 + for i in range(len(nums)): + # 将物品展开数量为1 + while nums[i] > 1: + weight.append(weight[i]) + value.append(value[i]) + nums[i] -= 1 + + dp = [0]*(bag_weight + 1) + # 遍历物品 + for i in range(len(weight)): + # 遍历背包 + for j in range(bag_weight, weight[i] - 1, -1): + dp[j] = max(dp[j], dp[j - weight[i]] + value[i]) + + print(" ".join(map(str, dp))) + +def test_multi_pack2(): + '''版本:改变遍历个数''' + weight = [1, 3, 4] + value = [15, 20, 30] + nums = [2, 3, 2] + bag_weight = 10 + + dp = [0]*(bag_weight + 1) + for i in range(len(weight)): + for j in range(bag_weight, weight[i] - 1, -1): + # 以上是01背包,加上遍历个数 + for k in range(1, nums[i] + 1): + if j - k*weight[i] >= 0: + dp[j] = max(dp[j], dp[j - k*weight[i]] + k*value[i]) + + print(" ".join(map(str, dp))) + + +if __name__ == '__main__': + test_multi_pack1() + test_multi_pack2() +``` + + + Go: